定义子问题 为: 在前 i 个物品中挑选总重量不超过 W 的物品,每种物品最多挑选 1 个,使得总价值最大,这时的最优值记作 m(i, W),其中 . 考虑第 i 个物品,无非两种选择,选或者不选.
不选的话,背包的容量不变,改变为问题 .
选的话,背包的容量变小,改变为问题
最优方案就是比较这两种方案,取其中的最大值
算上边界情况,可得如下状态转移方程
递归实现
1 2 3 4 5 6 7 8 9 10 11
/** i 表示第 i 个物品, w 表示当前的剩余容量,*/ intP(int i, int W, vector<int>& w, vector<int>& v) { if (i == 0) return0; if (W == 0) return0; if (w[i] > W) returnP(i - 1, W, w, v); returnmax(P(i - 1, W, w, v), v[i] + P(i - 1, W - w[i], w, v)); }