贪心算法的例题分析
贪心算法的名词解释
http://baike.baidu.com/view/298415.htm
第一个贪心算法 (最小生成树)
http://baike.baidu.com/view/288214.htm
第二个贪心算法 (Prim算法)
http://baike.baidu.com/view/671819.htm
第三个贪心算法 (kruskal算法)
http://baike.baidu.com/view/247951.htm
算法都有详细解释的
例题1、
[0-1背包问题]有一个背包,背包容量是M=150。有7个物品,物品不可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
物品 A B C D E F G
重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg
价值 10$ 40$ 30$ 50$ 35$ 40$ 30$
分析:
目标函数:∑pi最大
约束条件是装入的物品总重量不超过背包容量:∑wi<=M(M=150)
⑴根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?
⑵每次挑选所占重量最小的物品装入是否能得到最优解?
⑶每次选取单位重量价值最大的物品,成为解本题的策略。
值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。
贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。
可惜的是,它需要证明后才能真正运用到题目的算法中。
一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。
对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:
⑴贪心策略:选取价值最大者。
反例:
W=30
物品:A B C
重量:28 12 12
价值:30 20 20
根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。
⑵贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。
⑶贪心策略:选取单位重量价值最大的物品。
反例:
W=30
物品:A B C
重量:28 20 10
价值:28 20 10
根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。
【注意:如果物品可以分割为任意大小,那么策略3可得最优解】
对于选取单位重量价值最大的物品这个策略,可以再加一条优化的规则:对于单位重量价值一样的,则优先选择重量小的!这样,上面的反例就解决了。
但是,如果题目是如下所示,这个策略就也不行了。
W=40
物品:A B C
重量:25 20 15
价值:25 20 15
附:本题是个DP问题,用贪心法并不一定可以求得最优解,以后了解了动态规划算法后本题就有了新的解法。
例题2、
马踏棋盘的贪心算法
123041-23 XX
【问题描述】
马的遍历问题。在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。
【初步设计】
首先这是一个搜索问题,运用深度优先搜索进行求解。算法如下:
⒈ 输入初始位置坐标x,y;
⒉ 步骤 c:
如果c> 64输出一个解,返回上一步骤c--
(x,y) ← c
计算(x,y)的八个方位的子结点,选出那些可行的子结点
循环遍历所有可行子结点,步骤c++重复2
显然⑵是一个递归调用的过程,大致如下:
C++程序: #define N 8void dfs(int x,int y,int count){ int i,tx,ty; if(count>N*N) { output_solution();//输出一个解 return; } for(i=0; i<8; i++) { tx=hn[i].x;//hn[]保存八个方位子结点 ty=hn[i].y; s[tx][ty]=count; dfs(tx,ty,count+1);//递归调用 s[tx][ty]=0; }}Pascal程序: ProgramYS;ConstFXx:array[1..8]of-2..2=(1,2,2,1,-1,-2,-2,-1);FXy:array[1..8]of-2..2=(2,1,-1,-2,-2,-1,1,2);VarRoad:array[1..10,1..10]ofinteger;x,y,x1,y1,total:integer;ProcedureFind(x,y:integer);varNx,Ny,i:integer;BeginFori:=1to8dobegin{8个方向}If(x+FXx[i]in[1..8])and(y+FXy[i]in[1..8])Then{确定新坐标是否越界}IfRoad[x+Fxx[i],y+Fxy[i]]=0Thenbegin{判断是否走过}Nx:=x+FXx[i];Ny:=y+FXy[i];Road[Nx,Ny]:=1;{建立新坐标}If(Nx=x1)and(Ny=y1)Theninc(total)elseFind(Nx,Ny);{递归}Road[Nx,Ny]:=0{回朔}endendEnd;BEGIN{Main}Total:=0;FillChar(Road,sizeof(road),0);Readln(x,y);{读入开始坐标}Readln(x1,y1);{读入结束坐标}If(x>10)or(y>10)or(x1>10)or(y1>10)Thenwriteln('Error'){判断是否越界}ElseFind(x,y);Writeln('Total:',total){打出总数}END.这样做是完全可行的,它输入的是全部解,但是马遍历当8×8时解是非常之多的,用天文数字形容也不为过,这样一来求解的过程就非常慢,并且出一个解也非常慢。
怎么才能快速地得到部分解呢?
【贪心算法】
其实马踏棋盘的问题很早就有人提出,且早在1823年,J.C.Warnsdorff就提出了一个有名的算法。在每个结点对其子结点进行选取时,优先选择‘出口’最小的进行搜索,‘出口’的意思是在这些子结点中它们的可行子结点的个数,也就是‘孙子’结点越少的越优先跳,为什么要这样选取,这是一种局部调整最优的做法,如果优先选择出口多的子结点,那出口少的子结点就会越来越多,很可能出现‘死’结点(顾名思义就是没有出口又没有跳过的结点),这样对下面的搜索纯粹是徒劳,这样会浪费很多无用的时间,反过来如果每次都优先选择出口少的结点跳,那出口少的结点就会越来越少,这样跳成功的机会就更大一些。这种算法称为为贪心算法,也叫贪婪算法或启发式算法,它对整个求解过程的局部做最优调整,它只适用于求较优解或者部分解,而不能求最优解。这样的调整方法叫贪心策略,至于什么问题需要什么样的贪心策略是不确定的,具体问题具体分析。实验可以证明马遍历问题在运用到了上面的贪心策略之后求解速率有非常明显的提高,如果只要求出一个解甚至不用回溯就可以完成,因为在这个算法提出的时候世界上还没有计算机,这种方法完全可以用手工求出解来,其效率可想而知。
0-1背包问题的多种解法代码(动态规划、贪心法、回溯法、分支限界法...
实现该算法的过程: 从问题的某一初始解出发; while 能朝给定总目标前进一步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解; 2.例题分析 1).[背包问题]有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
两位乘法速算
链接: https:\/\/pan.baidu.com\/s\/1Kqpnn2jvFeSfUe7kFLWvTg 提取码: g6va 《巧虎数学大闯关&九九乘法组》目录:九九乘法歌 数学小高手1-倍数的秘密 数学小高手2-99乘法大发现 数学小高手3-生活中的乘法
求,小学生数学速算法。
帮助的人:61.6万 我也去答题访问个人页 关注 展开全部 想要真正速算,得从小练习心算法,很快。如果没有就通过练习提升硬计算速度,当然不建议这个方法,毕竟孩子不是机器。还可以提前教孩子运算规律,如分配率等,以及高斯数列等巧算法。手打,求采纳 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 ...
小学一年级怎么学习
小学一年级的话很简单,做到上课认真听讲不开小差就已经很棒了,在考试的时候能够做到不粗心考到自己能力范围内最好的分数也是一件值得开心的事情。小学一年级的话是幼儿园刚入小学的第一年,这一年通常是比较闹腾的,小孩子有部分会比较想家或者是想念幼儿园,还有一部分的话就会调皮的比较突出。这个...
新加坡超级心算法怎么样
还可以。《新加坡超级心算法.第一辑》适合小学低年级的孩子阅读和练习,这套书共3册,每本书包括35+心算技巧和15+综合训练。每套练习题都用一道例题展示一种心算技巧,同时提供供孩子练习的 10 道练习题。而且,出版这套书的新加坡新亚出版社(SAP)出版,它获得了“年度教育出版社奖”等多种奖项,到...
在深圳市平湖广场,逢节假日的时候,有一个老师经常在那推销的一本关于...
因本人水平所限,上面的算法不一定是最好的心算法 5速算五:史丰收速算 速算五:史丰收速算 由速算大师史丰收经过10年钻研发明的快速计算法,是直接凭大脑进行运算的方法,又称为快速心算、快速脑算。这套方法打破人类几千年从低位算起的传统方法,运用进位规律,总结26句口诀,由高位算起,再配合指算,加快计算速度,能...
计算能力差,怎么办,怎么学会速算?
因本人水平所限,上面的算法不一定是最好的心算法 其它 由速算大师史丰收经过10年钻研发明的快速计算法,是直接凭大脑进行运算的方法,又称为快速心算、快速脑算。这套方法打破人类几千年从低位算起的传统方法,运用进位规律,总结26句口诀,由高位算起,再配合指算,加快计算速度,能瞬间运算出正确结果,协助人类开发脑力...
快速算出两位数乘法的方法
上面的算法不一定是最好的心算法其它由速算大师史丰收经过10年钻研发明的快速计算法,是直接凭大脑进行运算的方法,又称为快速心算、快速脑算.这套方法打破人类几千年从低位算起的传统方法,运用进位规律,总结26句口诀,由高位算起,再配合指算,加快计算速度,能瞬间运算出正确结果,协助人类开发脑力,加强思维、分析、判断...
速算技巧,请不吝指教
在加、减、乘、除四则运算中除法是最麻烦的一项,即使使用速算法很多时候也要加上笔算才能更快更准地算出答案。因本人水平所限,上面的算法不一定是最好的心算法 其它 由速算大师史丰收经过10年钻研发明的快速计算法,是直接凭大脑进行运算的方法,又称为快速心算、快速脑算。这套方法打破人类几千年...
快速算出两位数乘法的方法
因本人水平所限,上面的算法不一定是最好的心算法其它由速算大师史丰收经过10年钻研发明的快速计算法,是直接凭大脑进行运算的方法,又称为快速心算、快速脑算。这套方法打破人类几千年从低位算起的传统方法,运用进位规律,总结26句口诀,由高位算起,再配合指算,加快计算速度,能瞬间运算出正确结果,协助人类开发脑力,...
黄沫锋派:[答案] 背包问题,看黑书的时候做过一个练习,可在我的空间“结构算法”分类下找到. 其中包含完整的代码.有问题欢迎交流啊
华亭县13430661996: 砝码称重问题怎么用贪心算法解决砝码称重问题:设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其质量 - ?
黄沫锋派:[答案] 现有1g、2g、3g、5g、10g、20g的砝码各若干枚,问用这些砝码可以称出多少种不同的重量.(设砝码的总重量不超过1000克,且砝码只能放在天平的一端) 输入方式:a1 a2 a3 a4 a5 a6 (表示1g砝码有a1个,2g砝码有a2个,.20g砝码有a6个) ...
华亭县13430661996: 贪心算法 部分背包问题 - ?
黄沫锋派: [背包问题]有一个背包,背包容量是M=150.有7个物品,物品可以分割成任意大小.要求尽可能让装入背包中的物品总价值最大,但不能超过总容量.物品 A B C D E F G 重量 35 30 60 50 40 10 25 价值 10 40 30 50 35 40 30 分析:目标...
华亭县13430661996: c语言问题急!!!(用贪心算法) - ?
黄沫锋派: 题分析:根据常识,我们到店里买东西找钱时,老板总是先给我们最大面值的,要是不够再找面值小一点的,直到找满为止.如果老板都给你找分数的或者几角的,那你肯定不干,另外,他也可能没有那么多零碎的钱给你找.其实这就是一个...
华亭县13430661996: 用贪心算法解决背包问题 - ?
黄沫锋派: 用贪心算法解决背包问题,首先要明白,结果不一定是全局最优的. 对于贪心法而言,首先步骤是找到最优度量标准,我这里的算法采用的最优度量标准是: 收益p/重量w 的值最大者优先放入背包中,所以有算法如下: void GreedyKnapsack(...
华亭县13430661996: 如何用贪心算法求解tsp问题 - ?
黄沫锋派: 最快回答那个不懂别乱说,别误人子弟.这题标准的贪心算法,甚至很多时候被当做贪心例题 要求平均等待时间,那么就得用 总等待时间 / 人数 所以只用关心总等待时间,如果数据大的在前面,那么后面必然都要加一次这个时间,所以按从小...
华亭县13430661996: 用贪心算法求解换零钱问题 - ?
黄沫锋派: 对货币按照面值从大到小排列,先按照最大面值给,然后将剩余的钱用次大的面值给,依此类推即可.
华亭县13430661996: 贪心算法 活动安排问题 - ?
黄沫锋派: 这道题的贪心算法比较容易理解,我就不多说明了,只是提到一下算法思路1、建立数学模型描述问题.我在这里将时间理解成一条直线,上面有若干个点,可能是某些活动的起始时间点,或终止时间点.在具体一下,如果编程来实现的话,将...
华亭县13430661996: 用贪心算法求解背包问题的最优解. - ?
黄沫锋派: 你这个是部分背包么?也就是说物品可以随意分割? 那么可以先算出单位重量物品的价值,然后只要从高价值到低价值放入就行了,按p[i]/w[i]降序排序,然后一件一件加,加满为止! 贪心的思路是:加最少的重量得到更大的价值! 算出单位价值为{6,4,3,2,7,5,2} 加的顺序即为5,1,6,2,3,4/7 如果重量不超过就全部都加,超过就加满为止 不懂可问望采纳! 推荐看dd_engi的背包九讲,神级背包教程!在此膜拜dd_engi神牛~