背包问题总结

本文总结了背包问题的动态规划解法,包括01背包和完全背包问题,探讨了背包容量j的遍历顺序以及i、j的内外关系对解题的影响。分析了在不同情况下,如何选择正确的遍历策略来避免物品重复使用或影响组合数量。
摘要由CSDN通过智能技术生成

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值