1.背包容量j的遍历顺序
此问题出现在物品数量是否有限的问题中。更新dp[j]时往往需要用到同一行上的数据dp[j-nums[i]],如果先遍历dp[j-nums[i]]则物品i有可能已经被装入了,然后遍历dp[j]时可能在dp[j-nums[i]]的装填方法上再装一个物品i,导致同一个物品i被使用两次。反之先遍历dp[j]后遍历dp[j-nums[i]]则可避免这种重复使用。
(1)01背包问题【Leecode题416、1049】
因为物品有限,需要考虑j的遍历顺序:
更新dp依赖同一行的数据时,从后往前:二维dp第一行初始化、滚动数组dp
更新dp不依赖同一行的数据时,从前往后、从后往前均可:二维dp迭代
(2)完全背包问题【Leecode题70】
因为物品无限,因此全都从前往后遍历背包容量j
2.i、j的内外关系,即按行/列遍历
此问题出现在求组合数量的问题中,非组合数量问题中i、j的内外关系没有影响。
可以分为两种情况:组合数量与元素顺序是否有关。
以下按照容量j=6的背包,有重量为1、5的物品nums[0]、nums[1],求恰好装满背包的方法讨论:
(1)组合数量与顺序有关:j外i内,按列遍历【Leecode题70、377】
此时dp[6]对i遍历时,会用到dp[1]和dp[5]。而dp[1]装了物品0,,dp[5]装了物品1。当dp