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;
}

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