动态规划-背包问题小结

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) 如果是涉及到求装满背包有几种方法的累加题目,分情况:


求组合数, 也就是同一批物品,不管顺序关系: 先遍历物品,然后遍历背包容量

求排列数, 也就是同一批物品,管顺序关系: 先遍历背包容量,后遍历物品

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值