与01背包的区别:
可以放入背包的物品可以重复放入多次
01背包:
for(int i = 0; i < weight.size(); i++) {
for(int j = Weight; j >= weight[i]; j--) {
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
但是,完全背包的内层循环的遍历顺序与01背包不同!
完全背包:
for(int i = 0; i < weight.size(); i++) {
for(int j = weight[i]; j < Weight ; j++) {
//与01背包不同顺序的原因是一个物品可以被加入无限次数
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
如图所示
前面我们可以看见如果01背包的外内层循环颠倒是错误的❗❗
因为这样会导致每一次的背包里面只有一个物品,但是对于完全背包来说,背包里只有一个物品并没有关系,因为一个物品可以被放入无数次。
如图所示
(注:本文部分内容参考公众号:代码随想录)