描述
有一个箱子容量为V(正整数,0<=v<=20000),同时有n个物品(0< n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入
第一行是一个整数V,表示箱子容量。
第二行是一个整数n,表示物品数。
接下来n行,每行一个正整数(不超过10000),分别表示这n个物品的各自体积。
输出
一个整数,表示箱子剩余空间。
样例输入
24 6 8 3 12 7 9 7
样例输出
0
思路:属于01背包的变形吧,相当于物品的价值和价值相同,然后更新的时候注意更新的值不能大于背包容量,而且最后不能直接输出背包容量v-f[v-1],因为加上最后一个物品可能会超出范围所以没有更新,所以最后要遍历找到最大值,再减去后输出。
#include <iostream>
using namespace std;
int w[35];
int f[20005];
int main(){
int v,n;
cin>>v>>n;
for(int i=0;i<n;i++){
cin>>w[i];
}
for(int i=0;i<n;i++){
for(int j=v;j>=w[i];j--){
if(f[j-w[i]]+w[i]<=v)
f[j]=max(f[j],f[j-w[i]]+w[i]);
}
}
int maxn=0;
for(int i=0;i<=v;i++){
maxn=max(f[i],maxn);
}
cout << v-maxn <<endl;
return 0;
}