天梯 1014 装箱问题
解题报告:有若干件物品,每件物品有一定的体积,然后有一个体积为V的箱子,要将物品放入这个箱子,求出箱子剩余的体积最小值。
这题其实是一个01背包,体积还是体积,主要就是要把每一件物品的体积当成是它的价值,这样按照01背包的方式求出可以放入的最大价值之后,因为体积等于价值,也就是说最大的 价值也就是可以放入的最大的体积,所以V-dp[V],就得到了最小的剩余体积了。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const int maxn = 20000 + 3; 6 int dp[maxn],w[maxn],V,n; 7 int main() { 8 scanf("%d%d",&V,&n); 9 for(int i = 1;i<=n;++i) 10 scanf("%d",&w[i]); 11 memset(dp,0,sizeof(dp)); 12 for(int i = 1;i<=n;++i) 13 for(int j = V;j>=w[i];--j) 14 dp[j] = max( dp[j] , dp[j-w[i]] + w[i]); 15 printf("%d\n",V-dp[V]); 16 return 0; 17 }