背包详解.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
背包详解

0/1背包问题:? 在M件物品取出若干件放在空间为W的背包里,每件物品的重量为W1,W·2……Wn,与之相对应的价值为P1,P2……Pn。求出获得最大价值的方案。 注意:在本题中,所有的重量值均为整数。 [算法分析]:? 对于背包问题,通常的处理方法是搜索。? 用递归来完成搜索,算法设计如下:? function make( i {处理到第i件物品} , j{剩余的空间为j}:integer) :integer;? 初始时i=m , j=背包总容量? begin? if i:=0 then? make:=0;? if j=wi then (背包剩余空间可以放下物品?i )? r1:=make(i-1,j-wi)+v[i]; (第i件物品放入所能得到的价值?)? r2:=make(i-1,j) (第i件物品不放所能得到的价值?)? make:=max{r1,r2}? end;? 这个算法的时间复杂度是o(2^n),我们可以做一些简单的优化。? 由于本题中的所有物品的重量均为整数,经过几次的选择后背包的剩余空间可能会相等,在搜索中会重复计算这些结点,所以,如果我们把搜索过程中计算过的结点的值记录下来,以保证不重复计算的话,速度就会提高很多。这是简单的以空间换时间。? 我们发现,由于这些计算过程中会出现重叠的结点,符合动态规划中子问题重叠的性质。? 同时,可以看出如果通过第n次选择得到的是一个最优解的话,那么第n-1次选择的结果一定也是一个最优解。这符合动态规划中最优子问题的性质。? 考虑用动态规划的方法来解决,这里的:? 阶段是:在前n件物品中,选取若干件物品放入背包中;? 状态是:在前n件物品中,选取若干件物品放入所剩空间为w的背包中的所能获得的最大价值;? 决策是:第n件物品放或者不放;? 由此可以写出动态转移方程:? 我们用f[i,j]表示在前?i?件物品中选择若干件放在所剩空间为?j?的背包里所能获得的最大价值? f[i,j]=max{f[i-1,j-wi]+pi (j=wi), f[i-1,j]}? 这样,我们可以自底向上地得出在前m件物品中取出若干件放进背包能获得的最大价值,也就是f[m,w]? 算法设计如下: procedure make;? begin? ?? for i:=0 to w do? ?? f[0,i]:=0;? ?? for i:=1 to m do? ???? for j:=0 to w do begin? ?????? f[i,j]:=f[i-1,j];?? ?????? if (j=w[i]) and (f[i-1,j-w[i]]+v[i]f[i,j]) then? ???????? f[i,j]:=f[i-1,j-w[i]]+v[i];? ????????????????????????? end;? ?? writeln(f[m,wt]);? end;? 由于是用了一个二重循环,这个算法的时间复杂度是o(n*w)。而用搜索的时候,当出现最坏的情况,也就是所有的结点都没有重叠,那么它的时间复杂度是o(2^n)。看上去前者要快很多。但是,可以发现在搜索中计算过的结点在动态规划中也全都要计算,而且这里算得更多(有一些在最后没有派上用场的结点我们也必须计算),在这一点上好像是矛盾的。? 事实上,由于我们定下的前提是:所有的结点都没有重叠。也就是说,任意n件物品的重量相加都不能相等,而所有物品的重量又都是整数,那末这个时候w的最小值是:1+2+2^2+2^3+……+2^n-1=2^n -1? 此时n*w2^n,动态规划比搜索还要慢~~|||||||所以,其实背包的总容量w和重叠的结点的个数是有关的。? 考虑能不能不计算那些多余的结点……? 那么换一种状态的表示方式:? 状态是:在前n件物品中,选取若干件物品放入所占空间为w的背包中的所能获得的最大价值;? 阶段和决策:同上;? 状态转移方程是:? f[i,j]=max{f[i-1,j-wi]+pi (j+wi=背包总容量), f[i-1,j]}? 这样,我们可以得出在前m件物品中取出若干件放进背包在所占空间不同的状态下能获得的最大价值,在其中搜索出最大的一个就是题目要求的解。? 算法设计如下:? procedure make;? begin? ?? f[0,wt]:=0;? ?? for i:=1 to n do? ?? for j:=0 to w (背包总容量) do? ?? if f[i-1,j]未被赋过值?then?(这些结点与计算无关,忽略)? ??????????????????????????????????????? continue? ?? else? ???? f[i,j]:=max{f[i-1,j+wi]+pi

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档