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