0-1背包和完全背包,初级理解和总结

0-1背包就是数组中元素只能取一个,完全背包就是数组中的元素能无限取。

最开始接触的就是纯粹的背包问题,就是怎么装是背包价值最大,
二维数组, if (j < weight[i]) dp[i][j] = dp[i - 1][j];
else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
一维数组, dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
二维变一维就是,把背包那一列压缩了,在每个背包容量元素寻找目标值的过程中沿用当前元素,发现更适合目标值,就替换当前值。
如果从记忆角度出发,就可以直接去掉于i相关的内容。

然后就是变形
分割等和子集,就是给定背包容量,看如何放使背包放满。
然后就是石头,就是给定背包容量,看如何放使背包尽量放满。
递归函数都是dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);只不过最后判断条件不一样。

还有就是所有取的方法的数量,题目就是目标和。
dp[j] += dp[j - nums[i]];当前的方法数量就是之前所有方法数量的和。
兑换零钱
dp[j] = min(dp[j - coins[i]] + 1, dp[j])

遍历顺序
先比遍历物品再遍历背包就0-1背包;先遍历背包再遍历物品就是完全背包。
还有一个是一维数组的话,如果是组合,背包的遍历就要倒序遍历,如果是排列就可以是正序。

posted @ 2024-01-21 12:39  yun-che  阅读(53)  评论(0)    收藏  举报