【NEUOJ1906】 0-1背包问题 II
原题链接:01背包2(可能需要东北大学校园网)
题意:将N件物品放入最大容量为W的背包中,最大的价值是多少,其中每一件物品的价值为 \(v_i\),体积为 \(w_i\)。
思路:该题与经典的01背包不同的点在于本题的物品最大体积很大,将物品最大体积作为背包容量不可行,所以本题我们可以换一种思路,将物品的最大价值作为背包容量,\(dp_i\) 内存放的是当价值为i时需要的最小体积,由此我们可以很轻松的推出该题的转移方程为
\[dp_i = min(dp_i,dp_{i - v_i})
\]
需要注意的是,本题的dp数组应初始化为极大值
代码如下:
点击查看代码
dp[0] = 0;
for(int i = 0; i < n; i++) {
//注意01背包问题需要从大往小dp
for(int j = 10000; j >= v[i]; j--) {
dp[j] = min(dp[j], dp[j - v[i]] + w[i]);
}
}
//从大往小第一个满足条件的i为最大价值
for(int i = 10000; i >= 0; i--) {
if(dp[i] <= W) {
cout << i << endl;
break;
}
}

浙公网安备 33010602011771号