解题报告:有若干件物品,每件物品有一定的体积,然后有一个体积为V的箱子,要将物品放入这个箱子,求出箱子剩余的体积最小值。
这题其实是一个01背包,体积还是体积,主要就是要把每一件物品的体积当成是它的价值,这样按照01背包的方式求出可以放入的最大价值之后,因为体积等于价值,也就是说最大的 价值也就是可以放入的最大的体积,所以V-dp[V],就得到了最小的剩余体积了。
1 #include2 #include 3 #include 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 }