背包问题和0-1背包问题

背包问题

有n个物品和一个背包,设物品 i 的价值为 vi ,重量为 wi ,可以选择每个物品的一部分放入背包,问怎么放物品可使背包总价值最大。
用贪心法解决

0-1背包问题

有n个物品和一个背包,背包容量是c,物品i的重量是wi,价值是vi,每个物品只有放入背包和不放入两种选择,问在背包容量允许的情况下选择哪些物品可使总价值最大
在这里插入图片描述
在这里插入图片描述

★贪心法解决背包问题

在这里插入图片描述

★动态规划法解决0-1背包问题

思路:
①动态规划解决0-1背包问题的基本思路是,一个物品一个物品地考虑,这里从第n个开始考虑(从第一个也可以,实质上一样,只是一些数据的下标和代表的意义不一样了,程序也随之不同,会一种很容易理解另一种,这里以从第n个开始考虑为例),每次考虑当前物品是否可以放入,放入带来的价值是否值得

②设m(i,j)为背包容量为j,可选择的物品为i~n时的最优值,放入物品背包容量j会变化。
例如m(1,c)表示,所有物品可选,背包当前容量为c时的最优值,即为问题的解。先考虑第n个物品可选,求出m[n,c],再一个一个考虑下一个物品,直到求出解
在这里插入图片描述

③那么有以下递归式,这是理解此问题的核心,把这几个递推式搞清楚动态规划解决0-1背包问题就基本掌握了(w是重量,v是价值)

只考虑第n个物品:
m(n,j)=0 j< Wn (背包装不下物品n)
m(n,j)=Vn j>= Wn (背包能装下物品n)

如果物品i放不进去,考虑i~n其实就是考虑i+1到n:
m(i,j)= m(i+1,j) j<Wi (背包装不下物品 i)

如果可以放进去,那么考虑有物品i和没物品i哪个价值大
m(i,j)=max{m(i+1,j) , m(i+1,j-Wi) +Vi} j>=Wi

在这里插入图片描述

程序如下:
在这里插入图片描述
以下程序确定哪个物品放入了背包
在这里插入图片描述

★回溯法解决0-1背包问题

用回溯法解决0-1背包问题,要构造一颗子集树
在这里插入图片描述
在这里插入图片描述

也是一个物品一个物品考虑,一层代表一个物品,左子树代表放入当前物品,右子树代表不放入,显然树搜索到叶子节点时候所有物品都考虑过了。如果背包容量足够,则进入左子树,否则不进入,当右子树可能包含最优解才进入,不必进入右子树时我们剪枝右子树,什么情况下剪枝呢?
在这里插入图片描述
例如:
在这里插入图片描述
程序如下:
在这里插入图片描述在这里插入图片描述

★分支限界法解决0-1背包问题

基本思想:
在这里插入图片描述有两种方法:
在这里插入图片描述

>>队列式

在这里插入图片描述在这里插入图片描述

>>优先队列式

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南无故人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值