纯完全背包(题型1,3)考虑的是最大价值,所以不用管遍历顺序

求最小数(题型4)也不用管遍历顺序

01背包

  • 二维初始化:j >= weight[0]时,dp[0][j] = value[0],(题型1,3),dp[0][0]分情况讨论或dp[0][0] = 1,其余全0(题型2,参考目标和)

  • 一维初始化:i >= weight[0]时,dp[i] = value[0],(题型1,3),dp[0] = 1,(题型2)

  • 二维遍历顺序:题型1,2,3先遍历物品还是先遍历背包都可以,第二层从小到大和从大大小都可以,因为由上方和左上方推出

  • 一维遍历顺序:题型1,2,3先遍历物品遍历背包,第二层从右到左遍历

完全背包

  • 二维初始化:j >= weight[0]时,dp[0][j] = (j / weight(0)) * value[0],(题型1,3)

  • 一维初始化:i >= weight[0]时,dp[i] = (i / weight[0]) * value[0],(题型1,3),dp[0] = 1,(题型2),dp[0] = 0,(题型4)

  • 二维遍历顺序:仅考虑题型1,3,先遍历物品还是先遍历背包都可以,第二层从小到大和从大大小都可以

  • 一维遍历顺序:题型2需考虑是组合还是排列问题,先遍历物品(组合),先遍历背包(排列),第二层从左到右遍历,题型1,3,4先遍历物品还是先遍历背包都可以,第二层从左到右遍历

题型

1、能否能装满背包、最多装多少(价值等于重量)

  • LeetCode416:分割等和子集

  • LeetCode1049:最后一块石头的重量Ⅱ

  • dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])

2、装满背包有几种方法

  • LeetCode494:目标和

  • LeetCode518:零钱兑换Ⅱ(完全背包,组合数)

  • LeetCode377:组合总和Ⅳ(完全背包,排列数)

  • 卡码网57:爬楼梯进阶版(完全背包,排列数)

  • dp[j] += dp[j - nums[i]]

3、背包装满最大价值

  • 卡码网46题

  • 卡码网52题(完全背包)

  • 完全:max(dp[i-1][j] , dp[i][j-weight[i]] + value[i])

  • 01:max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i])

  • dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

4、装满背包所有物品的最小个数

  • LeetCode322:零钱兑换(完全背包,最小数)

  • LeetCode279:完全平方数(完全背包,最小数)

  • dp[j] = min(dp[j - coins[i]] + 1, dp[j])