1. 对于背包问题的动态转移方程:
当前容量下装满背包有几种方法: dp[j] += dp[j-nums[i]]
当前容量下能否装满或者最多能装多少: dp[j] = max(dp[j], dp[j-nums[i]]+nums[i])
当前容量下装满的最大价值:dp[j] = max(dp[j], dp[j-weights[i]]+values[i]
当前容量下装满所用物品的最小个数:dp[j] = min(dp[j], dp[j-nums[i]]+1
2. 对于背包问题的初始化设置:
如果是装满背包有多少种方法: 全局初始化为0, dp[0]=1, 啥也不能装也算一种方法
如果是否装满或者最多能装多少: 全局初始化为0, dp[0] = 0, 0容量的背包不能装物品
如果是装满的最大价值: 全局初始化为0, dp[0] = 0, 0容量背包不能装物品
如果是装满所用物品的最小个数: 全局初始化为float("intf"), dp[0]=0, 0容量没法装
3. 对于背包问题的遍历顺序:
1) 0-1背包问题:
正向遍历物品, 逆向遍历背包容量, 且必须先遍历物品,后遍历背包容量
2) 完全背包问题: 正向遍历物品,正向遍历背包容量
3) 如果不是求装满背包有几种方法的累加题目, 这时候,先遍历物品或者先遍历背包容量都可, 我喜欢前一种
4) 如果是涉及到求装满背包有几种方法的累加题目,分情况:
求组合数, 也就是同一批物品,不管顺序关系: 先遍历物品,然后遍历背包容量
求排列数, 也就是同一批物品,管顺序关系: 先遍历背包容量,后遍历物品