算法合集之浅谈几类背包题.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
徐持衡 浙江省温州中学;背包问题作为一个经典问题在动态规划中是很基础的一个部分,然而以0-1背包问题为原题,衍生转变出的各类题目,可以说是千变万化,当然解法也各有不同,如此就有了继续探究的价值。;引言 背包的基本变换 ①完全背包 ②多次背包 ③单调队列优化 其他几类背包问题 ①树形依赖背包(选课) ②PKU3093 总结;多次背包问题:给定n 种物品和一个背包。第i种物品 的价值是Wi ,其体积为Vi,数量是Ki件,背包的容量为C。可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。;对于一个左右边界都只增不降的区间最值,可以用单调队列来做到总效率O(n)的维护。 如果要用单调队列来优化多次背包,就必须在多次背包问题中挖掘出一个维护区间最值的子问题。;对于多次背包,用最常见的状态表示是用F[i,j]表示前i种物品,总体积不超过j的最大价值总和。 当前只考虑第i种物品,假设体积v,价值w,数量k。 由于对于体积j,与其相关的只有那些对v的余数与j相同的体积,所以再按照体积j对v的余数分为v份。;我们可以把每一份分开处理,假设现在要考虑余数为d的部分。 用j来标号,规定编号j所对应的体积是d+j*v。 显然编号j可以从编号j-k到j中的任意一个转移而来,因为相邻的体积正好相差v。;区间[j-k,j],这个区间是随着j的递增而左右边界都递增的区间。 但是注意到由于不同编号对应的体积也是不一样的,显然体积大的价值也会大于等于体积小的,直接比较是没有意义的,所以还需要做一定的修正。;比如可以把体积d+j*v都退化到d,也就是说用F[i-1,j*v+d]- j*w来代替原来的价值进行比较大小。 这样就可以用单调队列来优化了,对于每件物品的转移均摊O(C),所以得到O(n*C)的算法。;树形依赖背包问题:给定n 件物品和一个背包。第i件物品 的价值是Wi ,其体积为Vi,但是依赖于第Xi件物品(必须选取Xi后才能取i,如果无依赖则Xi=0),依赖关系形成森林,背包的容量为C。可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。;这个概念最初是由DDengi在《背包九讲》中提出。 定义:考虑这样一种物品,它并没有固定的费用(体积)和价值,而是它的价值随着你分配给它的费用(体积)变化而变化。;泛化物品可以用一个一维数组来表示体积与价值的关系G[j]表示当体积为j的时候,相对应的价值为G[j] (C=j=0)。 显然,之前的背包动规数组Fi,就是一件泛化物品,因为Fi[j]表示的正是体积为j的时候的最大价值。同样的,多件物品也是可以合并成一件泛化物品。;泛化物品的和: 把两个泛化物品合并成一个泛化物品的运算,就是枚举体积分配给两个泛化物品,满足: G[j] = max{ G1[j-k] + G2[k] } (C=j=k=0) 把两个泛化物品合并的时间复杂度是O(C^2)。 这个概念也引自《背包九讲》。;对于这个问题,我们可以把每棵子树看作是一个泛化物品,那么一棵子树的泛化物品就是子树根节点的这件物品的泛化物品与由根所连的所有子树的泛化物品的和。 这就是一个O(n*C^2)的算法。;泛化物品与一件物品的和: 把一个泛化物品与一件物品合并成一个泛化物品,可以用类似于0 - 1背包经典动规的方法求出。 泛化物品的并: 因为两个泛化物品之间存在交集,所以不能同时两者都取,那么我们就需要求泛化物品的并,对同一体积,我们需要选取两者中价值较大的一者,效率O(C)。;考虑对以i为根的子树的处理,假设当前需要处理i的一个子节点s,体积v,价值w。 如果我们在当前的Fi中强制放入物品s后作为以s为根的子树的初始状态的话,那么处理完以s为根的子树以后,Fs就是与Fi有交集的泛化物品(实际上是Fs包含Fi),同时,Fs必须满足放了物品s,即Fs[j] (vj=0)已经无意义了,而Fs[j](C=j=v)必然包含物品s。 下一步只要求Fs与Fi的并,就完成了对一个子节点的处理。;对于当前节点i,我们找到一个子节点s。 把Fi赋值给Fs,作为这棵子树的初始状态。 递归处理以s为根的子树。;递归后就得到了最终的Fs。;再通过求Fi与Fs的并来完成对子节点s的更新。 最后得到新的Fi,就完成了对子节点s的更新。;1 PROCEDURE DEAL i , C 2 FOR s: = 1 TO n 3 IF s 是 i 的子节点 THEN 4 Fi → Fs 5 DEAL s , C – Vs //背包容量减小Vs 6 FOR K: =Vs TO C //求两者的并 7 Max ( Fi[ k ] , Fs[ k-Vs ] + Ws )

文档评论(0)

187****5045 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档