1、算法设计与分析实验报告0_1背包一 问题描述假设有n件物品,每件物品有各自的重量W1,W2,Wn和与之对应的价值V1,V2,Vn。设背包的容量为c,在不超过背包容量的前提下,求出获得最大价值总和的方案。(0-1背包的情况下物品不可分割,只能选择放入,或者不放入背包中)。二 求解思路1. 贪心策略问题开始阶段,将所有物品按价值从高到低排列,每一次往背包里放入不超过背包容量的价值最大的物品,直到没有物品可放入为止。 但事实证明,由于物品的不可分割性,0-1背包并不适合贪心策略。例:假设背包的容量为50,共有三件物品(重量,价值):(10,60),(20,100),(30,120)。若使用贪心策略,
2、则会选择一个(30,120)和一个(20,100)。得到的价值总和是220。而稍加计算便可知选取两个(20,100)和一个(10,60)可以得到更大的价值总和260。因此贪心策略不能给出0-1背包的最优解。 后话:即使是普通背包问题(物品可分割),每次选择价值最大的物品也不能得到最优解。正确的贪心策略应是:每次选择单位重量下价值最大的物品。由于本次实验主要讨论的是0-1背包问题,这里就不给出该贪心策略的证明。2. 动态规划(1)证明0-1背包问题具有最优子结构性质: 假设(x1,x2,xn)是容量为c的背包的一组最优解,其中xi的取值为0或1,表示是否放入背包中。则必有(x2,x3,xn)为如
3、下子问题的一组最优解: sumxi*wi (2=i=n) sumxi*vi (2=i x1*v1+ sumxi*vi (2=i=n)则(x1,y2,yn)是原问题的最优解,而(x1,x2,xn)不是,与假设矛盾。因此0-1背包具有最优子结构性质。(2) 状态转移方程0 i=0 or j=0mij= mi-1j j=wi证明:mij表示在物品数为i,背包容量为j的情况下所得到的最大价值总和。当物品数为0或背包容量为0的时候,最大价值自然为0;当物品数量增加到第i个的时候,若背包容量j比wi小,则无法装入该物品,因此物品i并未起到作用,相当于没有物品i,则mij=mi-1j;若背包容量j比wi大,
4、则要比较加入物品i和不加入物品i这两种情况下哪种方案的价值总和最大,即mij= maxmi-1j-wi+vi,mi-1j.例:背包容量为10 给出5个物品:(2,6),(2,3),(6,5),(5,4),(4,6) 则得到m数组为: 3. 上述算法改进细看上述数组,仍存在许多多余的计算。比如当存在i个物品时,若j=w1(假设为m(mj 且kw2(n个物品的重量和,其中n=m+1)有mik=mij。进一步分析,对于数组中的每一行来说,mij的值为一个递增的阶梯函数,则满足j=w条件的mij就是一个跳跃点,即价值总和会发生改变的点。举个例子,仍使用上述的数据,得到的m数组如下图,其中红色点为跳跃点
5、:W012345678910w=2,v=600666666666w=2,v=300669999999w=6,v=500669999111114w=5,v=4006699910111314w=4,v=6006699912151515 那么一个改进后的解题思路就出来了:倘若把每个图的跳跃点的横纵坐标记录下来,就相当于把整个函数的信息储存下来。对于表格中的每一行来说我们只要把每次跳变时的价值和和总重量记录下来,就可以把整行的数据表示出来了于是,我们可以建立这样一个集合pi:pi中储存第i行所有的跳变点pi中的元素为(w,v), w为总重量,v为价值和 这时候再来看看原来的状态转移方程: 0 i=0
6、or j=0mij= mi-1j j=wi当jWi时,如果有新的跳跃点出现,一定是在jc(背包容量)的点,因为这违反了题目要求 集合B:在pi和qi的并集中,如果存在(a,b)和(c,d)是piqi中的2个跳跃点,而且ca且db,则(c,d)也不会出现下一行的跳跃点集合中。因为在求最大值的过程中,如果的d2n时,算法一需要(n2n),而算法二需要O(minnc,2n),可节约时间。四实验总结使用动态规划算法一的时候,需开辟一个n*c的数组,当背包容量比较大的时候会耗费空间,且算法一存在许多不必要的计算,也浪费了时间。使得其时间复杂度为(n2n)。 算法二对算法一进行了优化,通过寻找跳跃点的方式减少了不必要的计算,节约了时间,其时间复杂度为O(minnc,2n)。但寻找跳跃点的过程时略显麻烦,也需要开辟一个二维数组,在空间上并没有很大改进。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1