0-1背包问题的变种

189 篇文章 0 订阅
162 篇文章 0 订阅

 

最简单的思路是,由于物品是可以无限使用的,但是背包的容量是有限的,所以,其实每个物品可以取到的数量是有最大值的。换句话说,可以将这个可以无限使用的物品的背包问题,转换成一个有限使用的物品的背包问题,只不过此时在选取的物品列表中,很多物品是重复的。只此而已,这是一个解决思路。更进一步,其实可以优化这个方案,这是因为,对于任意一个数字而言,都可以通过一个二进制码来表示,所以,对于这种同样的物品不一定向物品列表中添加1、1、1、1、1这样的序列,只需要添加1、2、4、8、16这样的序列就可以表示同一个物品取了多少个放进背包里。当背包容积非常大的时候,这是一个很好的优化思路。

 

 

 

介于每个物品只有1个这样的限制,和完全背包中每个物品可以无限地使用这个限制之间,就可以设计出一种多重背包问题。换句话说,对每个物品添加了一个约束,这个约束是每个物品有num[i]个,求解这样的问题。其实理解了完全背包的解决方案,多重背包问题是更加简单的。

 

 

多维费用的背包问题,前面介绍的背包问题,都只考虑c这一个背包限制,那么,假设每个物品都有体积和重量两个维度,与此同时,背包本身也有最大的体积和最大的重量的限制,要同时满足这两个局限的话,该怎么解决?其实,只是在动态规划过程中状态多了一个参数,相应地记录的这个动态规划的数组是一个三维数组。

 

 

 

比如说,现在要向背包中放入很多物品,在背包中放入某些物品后就不能再放入其它的物品了,这就是物品间排斥的约束。另外一种情况就是,放入某些物品,也必须把另外一些物品也放入进去。这就是物品之间互相依赖的约束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值