这个问题有很多变种如下:
1、0/1背包最值问题
2、0/1背包存在问题
3、0/1背包组合问题
一,最值问题的递推公式是这样的
for(int i = 0; i < weight.size(); i++) { // 遍历物品
for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
二,存在问题
// 开始 01背包
for(int i = 0; i < nums.size(); i++) {
for(int j = target; j >= nums[i]; j--) { // 每一个元素一定是不可重复放入,所以从大到小遍历
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
三,组合问题
for (int i = 0; i < nums.size(); i++) {
for (int j = bagSize; j >= nums[i]; j--) {
dp[j] += dp[j - nums[i]];
}
}
我们可以很容易看到他们的遍历方法很相似,几乎快一摸一样。
dp递推的公式我们可以通过找规律来找出来,但一定要弄清楚遍历的过程是怎么样的。
然后我总结了一下01背包问题的模板:
1,初始化数组
2,判断是否需要求和
3,双重循环遍历,通过递推公式得出最后结果。