背包问题
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]);
}
}
代码中,遍历背包容量时必须要从后往前遍历,这样的原因是这样的遍历顺序保证遍历到的是上一轮数据然后进行更新,而如果换为前后遍历,则数据可能根据这一轮遍历后已经更新的数据进行更新(变成了完全背包问题,即一个物品可以取无数次)
完全背包问题
完全背包的物品是可以添加多次的,所以要从小到大去遍历
for(int i = 0; i < weight.size(); i++) { // 遍历物品
for(int j = weight[i]; j < bagWeight ; j++) { // 遍历背包容量
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}