算法合集之《浅谈几类背包题》

算法合集之《浅谈几类背包题》

ID:42228613

大小:1.48 MB

页数:25页

时间:2019-09-11

算法合集之《浅谈几类背包题》_第1页
算法合集之《浅谈几类背包题》_第2页
算法合集之《浅谈几类背包题》_第3页
算法合集之《浅谈几类背包题》_第4页
算法合集之《浅谈几类背包题》_第5页
资源描述:

《算法合集之《浅谈几类背包题》》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、徐持衡浙江省温州中学背包问题作为一个经典问题在动态规划中是很基础的一个部分,然而以0-1背包问题为原题,衍生转变出的各类题目,可以说是千变万化,当然解法也各有不同,如此就有了继续探究的价值。引言背包的基本变换①完全背包②多次背包③单调队列优化其他几类背包问题①树形依赖背包(选课)②PKU3093总结多次背包问题:给定n种物品和一个背包。第i种物品的价值是Wi,其体积为Vi,数量是Ki件,背包的容量为C。可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。对于一个左右边界都只增不降的区间最值,可以用单调队列来做到总效率O(n)的维护。如果要用单调队列来

2、优化多次背包,就必须在多次背包问题中挖掘出一个维护区间最值的子问题。对于多次背包,用最常见的状态表示是用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。编号j01234……对应体积dd+vd+2*vd+3*vd+4*v……区间

3、[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),依赖关系形成森林,背包

4、的容量为C。可以任意选择装入背包中的物品,求装入背包中物品的最大总价值。这个概念最初是由DDengi在《背包九讲》中提出。定义:考虑这样一种物品,它并没有固定的费用(体积)和价值,而是它的价值随着你分配给它的费用(体积)变化而变化。泛化物品可以用一个一维数组来表示体积与价值的关系G[j]表示当体积为j的时候,相对应的价值为G[j](C>=j>=0)。显然,之前的背包动规数组Fi,就是一件泛化物品,因为Fi[j]表示的正是体积为j的时候的最大价值。同样的,多件物品也是可以合并成一件泛化物品。泛化物品的和:把两个泛化物品合并成一个泛化物品的运算,就是枚举体积分配

5、给两个泛化物品,满足:G[j]=max{G1[j-k]+G2[k]}(C>=j>=k>=0)把两个泛化物品合并的时间复杂度是O(C^2)。这个概念也引自《背包九讲》。对于这个问题,我们可以把每棵子树看作是一个泛化物品,那么一棵子树的泛化物品就是子树根节点的这件物品的泛化物品与由根所连的所有子树的泛化物品的和。这就是一个O(n*C^2)的算法。泛化物品与一件物品的和:把一个泛化物品与一件物品合并成一个泛化物品,可以用类似于0-1背包经典动规的方法求出。泛化物品的并:因为两个泛化物品之间存在交集,所以不能同时两者都取,那么我们就需要求泛化物品的并,对同一体积,我

6、们需要选取两者中价值较大的一者,效率O(C)。考虑对以i为根的子树的处理,假设当前需要处理i的一个子节点s,体积v,价值w。如果我们在当前的Fi中强制放入物品s后作为以s为根的子树的初始状态的话,那么处理完以s为根的子树以后,Fs就是与Fi有交集的泛化物品(实际上是Fs包含Fi),同时,Fs必须满足放了物品s,即Fs[j](v>j>=0)已经无意义了,而Fs[j](C>=j>=v)必然包含物品s。下一步只要求Fs与Fi的并,就完成了对一个子节点的处理。对于当前节点i,我们找到一个子节点s。把Fi赋值给Fs,作为这棵子树的初始状态。递归处理以s为根的子树。编号

7、012345……Fia0a1a2a3a4a5……编号012345……Fsa0a1a2a3a4a5……si递归后就得到了最终的Fs。编号012345……Fsb0b1b2b3b4b5……siFisiFs必然包含再通过求Fi与Fs的并来完成对子节点s的更新。最后得到新的Fi,就完成了对子节点s的更新。编号012345……Fsb0+wb1+wb2+wb3+wb4+wb5+w……编号vv+1v+2v+3v+4v+5……Fiavav+1av+2av+3av+4av+5……更新1PROCEDUREDEALi,C2FORs:=1TOn3IFs是i的子节点THEN4Fi→Fs

8、5DEALs,C–Vs//背包容量减小Vs6FORK

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。