算法分析与设计-贪心算法求解背包问题.doc

算法分析与设计-贪心算法求解背包问题.doc

ID:54851319

大小:66.50 KB

页数:3页

时间:2020-04-22

算法分析与设计-贪心算法求解背包问题.doc_第1页
算法分析与设计-贪心算法求解背包问题.doc_第2页
算法分析与设计-贪心算法求解背包问题.doc_第3页
资源描述:

《算法分析与设计-贪心算法求解背包问题.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、《算法分析与设计》3用贪心算法求解背包问题D软件101薛思雨一、贪心算法介绍顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。贪心算法求解的问题一般具有两个重要性质:贪心选择性质和最优子结构性质

2、。所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。二、贪心法的基本思路从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。该算法存在问题:1.不能保证求得的最后解是最佳的;2.不能用来求最大

3、或最小解问题;3.只能求满足某些约束条件的可行解的范围。三、关于贪心算法在背包问题中的应用的探讨①问题描述:0-1背包问题:给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包(1)或不装入背包(0)。不能将物品i装入背包多次,也不能只装入部分的物品i。背包问题:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i

4、≤n。②贪心算法解决背包问题有几种策略:(i)一种贪婪准则为:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。这种策略不能保证得到最优解。例如,考虑n=2,w=[100,10,10],p=[20,15,15],c=105。当利用价值贪婪准则时,获得的解为x=[1,0,0],这种方案的总价值为20。而最优解为[0,1,1],其总价值为30。(ii)另一种方案是重量贪婪准则是:从剩下的物品中选择可装入背包的重量最

5、小的物品。虽然这种规则对于前面的例子能产生最优解,但在一般情况下则不一定能得到最优解。考虑n=2,w=[10,20],p=[5,100],c=25。当利用重量贪婪策略时,获得的解为x=[1,0],比最优解[0,1]要差。(iii)还有一种贪婪准则,就是我们教材上提到的,认为,每一项计算yi=vi/si,即该项值和大小的比,再按比值的降序来排序,从第一项开始装背包,然后是第二项,依次类推,尽可能的多放,直到装满背包。《算法分析与设计》3有的参考资料也称为价值密度pi/wi贪婪算法。这种策略也不能保证得到最优解。

6、利用此策略试解n=3,w=[20,15,15],p=[40,25,25],c=30时的最优解。虽然按pi/wi非递(增)减的次序装入物品不能保证得到最优解,但它是一个直觉上近似的解。而且这是解决普通背包问题的最优解,因为在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。③贪心算法解决背包问题的算法实现:《算法分析与设计》3#include"iostream"usingnamespacestd;structgoodinfo{floatp;//物品效益floatw;//物品重量f

7、loatX;//物品该放的数量intflag;//物品编号};//物品信息结构体voidInsertionsort(goodinfogoods[],intn){intj,i;for(j=2;j<=n;j++){goods[0]=goods[j];i=j-1;while(goods[0].p>goods[i].p){goods[i+1]=goods[i];i--;}goods[i+1]=goods[0];}}//按物品效益,重量比值做升序排列voidbag(goodinfogoods[],floatM,intn

8、){floatcu;inti,j;for(i=1;i<=n;i++)goods[i].X=0;cu=M;//背包剩余容量for(i=1;icu)//当该物品重量大与剩余容量跳出break;goods[i].X=1;cu=cu-goods[i].w;//确定背包新的剩余容量}if(i<=n)goods[i].X=cu/goods[i].w;//该物品所要放的

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

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

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