算法设计-01背包问题的分析

上传人:小** 文档编号:90969885 上传时间:2019-06-20 格式:DOC 页数:7 大小:108.09KB
返回 下载 相关 举报
算法设计-01背包问题的分析_第1页
第1页 / 共7页
算法设计-01背包问题的分析_第2页
第2页 / 共7页
算法设计-01背包问题的分析_第3页
第3页 / 共7页
算法设计-01背包问题的分析_第4页
第4页 / 共7页
算法设计-01背包问题的分析_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《算法设计-01背包问题的分析》由会员分享,可在线阅读,更多相关《算法设计-01背包问题的分析(7页珍藏版)》请在金锄头文库上搜索。

1、算法设计与分析 -0/1背包问题实例研究 班级:090402学号:20091236姓名:王 龙 一、问题描述 有N件物品和一个容量为V的背包。第i件物品的费用是ci,价值是wi。求解将哪些物品装入背包可使价值总和最大。二、基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即fiv表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:fiv=maxfi-1v,fi-1v-ci+wi这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只

2、考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为fi-1v;如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-ci的背包中”,此时能获得的最大价值就是fi-1v-ci再加上通过放入第i件物品获得的价值wi。三、优化空间复杂度我们可以很容易的得出,以上方法的时间和空间复杂度均为O(VN),其中时间复杂度应该已经不能再优化了,但空间复杂度却可以优化到O。先考虑上面说的基本思路如何实现,肯定是有一个主循环i=1.N,每次算出来二维数组fi0.V的所有值。那么,如果只

3、用一个数组f0.V,能不能保证第i次循环结束后fv中表示的就是我们定义的状态fiv呢?fiv是由fi-1v和fi-1v-ci两个子问题递推而来,能否保证在推fiv时(也即在第i次主循环中推fv时)能够得到fi-1v和fi-1v-ci的值呢?事实上,这要求在每次主循环中我们以v=V.0的顺序推fv,这样才能保证推fv时fv-ci保存的是状态fi-1v-ci的值。伪代码如下:for i=1.N for v=V.0 fv=maxfv,fv-ci+wi;其中的fv=maxfv,fv-ci一句恰就相当于我们的转移方程fiv=maxfi-1v,fi-1v-ci,因为现在的fv-ci就相当于原来的fi-1v

4、-ci。如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了fiv由fiv-ci推知,与本题意不符,但它却是另一个重要的背包问题(完全背包问题)最简捷的解决方案,故学习只用一维数组解01背包问题是十分必要的。事实上,使用一维数组解01背包的程序我们会被多次用到,所以这里抽象出一个处理一件01背包中的物品过程,在平时的ACM训练中程序代码我们会直接调用,因此这里不再加以说明。过程ZeroOnePack,表示处理一件01背包中的物品,两个参数cost、weight分别表明这件物品的费用和价值。procedure ZeroOnePack(cost,weight) for v=V.cost fv=m

5、axfv,fv-cost+weight 值得注意的是,这个过程里的处理与前面给出的伪代码有所不同。前面的示例程序写成v=V.0是为了在程序中体现每个状态都按照方程求解了,避免不必要的思维复杂度。而这里既然已经抽象成看作黑箱的过程了,就可以加入优化。费用为cost的物品不会影响状态f0.cost-1,这是显然的。因此,有了这个过程以后,01背包问题的伪代码就可以这样写:for i=1.NZeroOnePack(ci,wi); 四、初始化的细节问题我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两

6、种问法的实现方法是在初始化的时候有所不同。如果是第一种问法,要求恰好装满背包,那么在初始化时除了f0为0其它f1.V均设为-,这样就可以保证最终得到的fN是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f0.V全部设为0。为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的

7、价值为0,所以初始时状态的值也就全部为0了。这个小技巧是我们从ACM的做题中自己摸索出来的,同样这个小技巧完全可以推广到其它类型的背包问题,在这里我也就不再对进行状态转移之前的初始化进行讲解。五、一个常数优化前面的伪代码中有 for v=V.1,我们可以将这个循环的下限进行改进。由于只需要最后fv的值,倒推前一个物品,其实只要知道fv-wn即可。以此类推,对以第j个背包,其实只需要知道到fv-sumwj.n即可,即代码中的for i=1.N for v=V.0可以改成for i=1.n bound=maxV-sumwi.n,cifor v=V.bound这对于V比较大时是相当有用的。六、0/1

8、背包实例为了进一步的理解0/1背包问题,我们可以做一下具体的实践。以USACO 2007 December Silver中Charm Bracelet问题做具体的说明。1、 问题的描述:Bessie has gone to the malls jewelry store and spies a charm bracelet. Of course, shed like to fill it with the best charms possible from the N (1 N 3,402) available charms. Each charm i in the supplied list

9、 has a weight Wi (1 Wi 400), a desirability factor Di (1 Di 100), and can be used at most once. Bessie can only support a charm bracelet whose weight is no more than M (1 M 12,880).Given that weight limit as a constraint and a list of the charms with their weights and desirability rating, deduce the

10、 maximum possible sum of ratings.Input* Line 1: Two space-separated integers: N and M* Lines 2.N+1: Line i+1 describes charm i with two space-separated integers: Wi and Di Output* Line 1: A single integer that is the greatest sum of charm desirabilities that can be achieved given the weight constrai

11、ntsSample Input4 61 4 2 63 122 7Sample Output232、题目大意 有n个手镯, 每个手镯有一定的重量和让Bessie高兴的程度, 现在Bessie最多带重量不超过m的手镯, 求该怎样选取手镯使Bessie最高兴.3、问题分析标准的01背包,动态转移方程如下。其中dpi,j表示的是前i个物品装入容量为j的背包里所能产生的最大价值,wi是第i个物品的重量,di是第i个物品的价值。如果某物品超过背包容量,则该物品一定不放入背包,问题变为剩余i-1个物品装入容量为j的背包所能产生的最大价值;否则该物品装入背包,问题变为剩余i-1个物品装入容量为j-wi的背包所

12、能产生的最大价值加上物品i的价值di,思路相当清晰,因此我们可以编写出以下代码。4、源代码#include using namespace std; const int N = 3403;const int M = 12881; int dpM = 0; int max(int x, int y)return x y ? x : y; int main()int n, m;int wN, dM; cin n m; for (int i = 1; i wi di; for (int i = 1; i = wi; j-)dpj = max(dpj-wi + di, dpj); cout dpm endl; return 0; 5.运行结果: 七、小结以上0/1背包实例问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成0/1背包问题求解。通过此次的练习,我们应该发现,状态转移方程的意义,以及最后怎样优化的空间复杂度。这对于更好的解决此类问题具有很重要的意义。为后续的学习打下坚实的基础。 6 / 7

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号