codeVS 1014 裝箱問題 2001年NOIP全國聯賽普及組

1014 裝箱問題     2001年NOIP全國聯賽普及組

時間限制: 1 s    空間限制: 128000 KB    題目等級 : 黃金 Gold

題目描述 Description

有一個箱子容量爲V(正整數,0<=V<=20000),同時有n個物品(0<n<=30),每個物品有一個體積(正整數)。

要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間爲最小。


輸入描述 Input Description

一個整數v,表示箱子容量

一個整數n,表示有n個物品

接下來n個整數,分別表示這n 個物品的各自體積


輸出描述 Output Description

一個整數,表示箱子剩餘空間。


樣例輸入 Sample Input

24

6

8

3

12

7

9

7


樣例輸出 Sample Output

0



解題思路


揹包問題。

dp[i] 表示已用容積爲 i 這個狀態可用。


AC代碼如下:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int v, n;
    int w[31];
    int dp[20001] = {0};
    while(cin>>v>>n){
        for(int i = 0; i < n; ++i){
            cin>>w[i];
        }
        dp[0] = 1;//初始狀態已用容積爲0
        for(int i = 0; i < n; ++i){
            for(int j = v; j >= 0; --j){
                if(dp[j] && j+w[i]<=v){
                    dp[j + w[i]] = 1;
                }
            }
        }
        for(int j = v; j >= 0; --j){
            if(dp[j]){//第一個找到的填充的最完全(剩餘容積最小)
                cout<<v - j<<endl;
                break;
            }
        }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章