贪心算法的例题分析 求三四个贪心算法的例题(配源程序代码,要带说明解释的)!非常...

\u4ec0\u4e48\u662f\u8d2a\u5fc3\u7b97\u6cd5\uff0c\u7528\u5b9e\u4f8b\u5206\u6790\u8d2a\u5fc3\u7b97\u6cd5\u662f\u5982\u4f55\u89e3\u51b3\u5b9e\u9645\u95ee\u9898


\u8d2a\u5fc3\u7b97\u6cd5\u7684\u540d\u8bcd\u89e3\u91ca
http://baike.baidu.com/view/298415.htm

\u7b2c\u4e00\u4e2a\u8d2a\u5fc3\u7b97\u6cd5 \uff08\u6700\u5c0f\u751f\u6210\u6811\uff09
http://baike.baidu.com/view/288214.htm

\u7b2c\u4e8c\u4e2a\u8d2a\u5fc3\u7b97\u6cd5 \uff08Prim\u7b97\u6cd5\uff09
http://baike.baidu.com/view/671819.htm

\u7b2c\u4e09\u4e2a\u8d2a\u5fc3\u7b97\u6cd5 \uff08kruskal\u7b97\u6cd5\uff09
http://baike.baidu.com/view/247951.htm


\u7b97\u6cd5\u90fd\u6709\u8be6\u7ec6\u89e3\u91ca\u7684

例题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鑳屽寘闂鐨勫绉嶈В娉曚唬鐮(鍔ㄦ佽鍒掋璐績娉曘佸洖婧硶銆佸垎鏀檺鐣屾硶...
    绛旓細瀹炵幇璇绠楁硶鐨杩囩▼: 浠庨棶棰樼殑鏌愪竴鍒濆瑙e嚭鍙; while 鑳芥湞缁欏畾鎬荤洰鏍囧墠杩涗竴姝 do 姹傚嚭鍙瑙g殑涓涓В鍏冪礌; 鐢辨墍鏈夎В鍏冪礌缁勫悎鎴愰棶棰樼殑涓涓彲琛岃В; 2.渚嬮鍒嗘瀽 1).[鑳屽寘闂]鏈変竴涓儗鍖,鑳屽寘瀹归噺鏄疢=150銆傛湁7涓墿鍝,鐗╁搧鍙互鍒嗗壊鎴愪换鎰忓ぇ灏忋 瑕佹眰灏藉彲鑳借瑁呭叆鑳屽寘涓殑鐗╁搧鎬讳环鍊兼渶澶,浣嗕笉鑳借秴杩囨诲閲忋
  • 绠楁硶鎬庝箞瀛
    绛旓細姣忔閮借繍閫佽楁椂鏈闀跨殑涓や汉鑰屼笉褰卞搷鍏跺畠浜,闂鍏锋湁璐績瀛愮粨鏋勭殑鎬ц川銆 AC浠g爜: } 6.鍖洪棿瑕嗙洊闂 POJ1328鏄竴閬撶粡鍏哥殑璐績绠楁硶渚嬮銆傞鐩ぇ鎰忔槸鍋囪娴峰哺绾挎槸涓鏉℃棤闄愬欢浼哥殑鐩寸嚎銆傞檰鍦板湪娴峰哺绾跨殑涓渚,鑰屾捣娲嬪湪鍙︿竴渚с傛瘡涓涓皬鐨勫矝灞挎槸娴锋磱涓婄殑涓涓偣銆傞浄杈惧潗钀戒簬娴峰哺绾夸笂,鍙兘瑕嗙洊d璺濈,鎵浠ュ鏋滃皬宀涜兘澶熻瑕嗙洊鍒...
  • 浜斿ぇ甯哥敤绠楁硶涔嬩竴:璐績绠楁硶
    绛旓細璐績绠楁硶杩樻槸寰堝父瑙佺殑绠楁硶涔嬩竴锛岃繖鏄敱浜庡畠绠鍗曟槗琛岋紝鏋勯犺椽蹇冪瓥鐣ヤ笉鏄緢鍥伴毦銆 鍙儨鐨勬槸锛屽畠闇瑕佽瘉鏄庡悗鎵嶈兘鐪熸杩愮敤鍒伴鐩殑绠楁硶涓 涓鑸潵璇达紝璐績绠楁硶鐨璇佹槑鍥寸粫鐫锛氭暣涓棶棰樼殑鏈浼樿В涓瀹氱敱鍦ㄨ椽蹇冪瓥鐣ヤ腑瀛樺湪鐨勫瓙闂鐨勬渶浼樿В寰楁潵鐨勩 瀵逛簬渚嬮涓殑3绉嶈椽蹇冪瓥鐣ワ紝閮芥槸鏃犳硶鎴愮珛锛堟棤娉曡璇佹槑...
  • 淇℃伅瀛 鍔ㄦ佽鍒 涔犻
    绛旓細瑙e喅闂鐨勬柟娉曟槸璐績绠楁硶:灏咰1/W1,C2/W2,...Cn/Wn,浠庡ぇ鍒板皬鎺掑簭,涓嶅仠鍦伴夋嫨浠峰间笌閲嶉噺姣旀渶澶х殑鏀句汉鑳屽寘鐩村埌鏀炬弧涓烘.2.0/1鑳屽寘 涓涓梾琛岃呮湁涓涓渶澶氳兘鐢╩鍏枻鐨勮儗鍖咃紝鐜板湪鏈塶浠剁墿鍝侊紝瀹冧滑鐨勯噸閲忓垎鍒槸W1锛學2锛...,Wn,瀹冧滑鐨勪环鍊煎垎鍒负C1,C2,...,Cn.鑻ユ瘡绉嶇墿鍝佸彧鏈変竴浠舵眰鏃呰鑰呰兘...
  • PASCAL绠楁硶鐭ヨ瘑棰榽~楂樺垎~绱ф
    绛旓細鎴戜滑閫氳繃鐗圭偣2鍚戝ぇ瀹朵粙缁嶄簡璐績绛栫暐鐨勬暟瀛︽弿杩般傜敱浜庤繍鐢ㄨ椽蹇冪瓥鐣ヨВ棰樺湪姣忎竴娆¢兘鍙栧緱浜嗘渶浼樿В,浣嗚兘澶熶繚璇佸眬閮ㄦ渶浼樿В寰椾笉涓瀹氭槸璐績绠楁硶銆傚澶у鎵鐔熸倝寰楀姩鎬佽鍒掔畻娉曞氨鍙互婊¤冻灞閮ㄦ渶浼樿В,浣嗚椽蹇冪瓥鐣ユ瘮鍔ㄦ佽鍒掓椂闂存晥鐜囨洿楂樼珯鐢ㄥ唴瀛樻洿灏,缂栧啓绋嬪簭鏇寸畝鍗曘 7.3 鍏稿瀷渚嬮涓涔犻 渚4:鑳屽寘闂: 鏈変竴涓儗鍖,鑳屽寘瀹归噺鏄...
  • 姹傚涔燗CM鎸囧!!!
    绛旓細涓嬮潰鏄垜鍐欒繃鐨勮椽蹇冨拰DP鐨勪竴閮ㄥ垎浣犲彲浠ュ厛鍐欏啓锛1161棰橈紝1196,2002锛1524棰樺厛鏀炬斁鍙兘鏈夌偣闅惧害灏辨槸杩欎簺浜嗭紝鏈杩戝湪缂栧啓鍔ㄦ佽鍒掓荤粨鏂囨。锛屼絾杩樻病鎶界┖寮勫嚭鏉ワ紝鎵浠ヤ笉鑳藉彂缁欎綘浜嗭紝锛岋紝灏辫繖浜涗簡锛屾湜閲囩撼銆璐績绠楁硶 2 ZOJ Problem Set - 1161 3 ZOJ Problem Set - 1239 7 ZOJ Problem Set - 1360 10...
  • 鎵鹃浂闂 璐績绠楁硶浣曟椂涓烘渶浼樿В
    绛旓細鏈蹇洖绛旈偅涓笉鎳傚埆涔辫锛屽埆璇汉瀛愬紵銆 杩欓鏍囧噯鐨璐績绠楁硶锛岀敋鑷冲緢澶氭椂鍊欒褰撳仛璐績渚嬮 瑕佹眰骞冲潎绛夊緟鏃堕棿锛岄偅涔堝氨寰楃敤 鎬荤瓑寰呮椂闂 / 浜烘暟 鎵浠ュ彧鐢ㄥ叧蹇冩荤瓑寰呮椂闂达紝 濡傛灉鏁版嵁澶х殑鍦ㄥ墠闈紝閭d箞鍚庨潰蹇呯劧閮借鍔犱竴娆¤繖涓椂闂达紝鎵浠ユ寜浠庡皬鍒板ぇ鎺掋
  • C璇█绋嬪簭,杈撳叆N涓偣鐨勫潗鏍,鍒ゆ柇鑳藉惁鏋勬垚鍑稿杈瑰舰
    绛旓細鎺屾彙鍔ㄦ佽鍒掓濇兂鍒嗘瀽闂鐨勪竴鑸柟娉,瀵硅緝绠鍗曠殑闂鑳芥纭垎鏋,璁捐鍑哄姩鎬佽鍒绠楁硶,骞惰兘蹇熺紪绋嬪疄鐜般 瀹為獙鍐呭:缂栫▼瀹炵幇璁茶繃鐨勪緥棰:鏈闀垮叕鍏卞瓙搴忓垪闂銆佺煩闃佃繛涔橀棶棰樸佸嚫澶氳竟褰㈡渶浼樹笁瑙掑墫鍒嗛棶棰樸佺數璺竷绾块棶棰樼瓑銆傛湰瀹為獙涓殑闂,璁捐鍑虹畻娉曞苟缂栫▼瀹炵幇銆 涔犻1. 鏈闀垮叕鍏卞瓙搴忓垪 涓涓粰瀹氬簭鍒楃殑瀛愬簭鍒楁槸鍦ㄨ搴忓垪涓...
  • 绠楁硶涓庣▼搴忚璁″熀纭鐣ヨ(闄勫甫娲涜胺渚嬮)
    绛旓細绠楁硶绛栫暐鍚屾牱閲嶈锛屾瘮濡傚垎娌绘硶锛岄氳繃閫掑綊灏嗗ぇ闂鎷嗚В涓哄皬闂锛屽澹叺宸¢婚棶棰樸傛煡鎵剧畻娉曪紝濡傞『搴忓拰浜屽垎锛屼互鍙婃帓搴忕畻娉曪紝濡傞夋嫨銆佹彃鍏ャ佸啋娉″拰蹇熸帓搴忥紝閮芥槸鏁堢巼涓庢纭х殑骞宠 銆傚姩鎬佽鍒掞紝閫氳繃鐘舵佽浆绉绘眰瑙f渶浼樿В锛岃璐績绠楁硶鍒欒拷姹傛瘡涓姝ョ殑灞閮ㄦ渶浼橈紝濡傛湪妫嶅姞宸ュ拰鍏殗鍚庨棶棰樸傞殢鏈哄寲绠楁硶鐨寮曞叆锛屽妯℃嫙...
  • 瀛︿範C璇█闇瑕佹帉鎻″摢浜涘熀鏈煡璇?
    绛旓細28. C璇█鏈甯哥敤鐨璐績绠楁硶 C璇█鏈甯哥敤鐨勮椽蹇冪畻娉曞氨杩欎箞琚敾鍏嬩簡 29. 甯歌鐨凜璇█鍐呭瓨閿欒鍙婂绛 甯歌鐨凜璇█鍐呭瓨閿欒鍙婂绛 30. C璇█瀹炵幇闈㈠悜瀵硅薄鐨勫師鐞 C璇█瀹炵幇闈㈠悜瀵硅薄鐨勫師鐞 31. C璇█/C++鍐呭瓨绠$悊 鐪嬪畬杩欑瘒浣犺繕鑳戒笉鎳侰璇█/C++鍐呭瓨绠$悊? 32. 鍐嶈皥C璇█鎸囬拡 鍐嶈皥鎸囬拡:澶т浆缁欎綘鎷ㄥ紑 C 鎸囬拡鐨勪簯闆...
  • 扩展阅读:贪心算法实例大全 ... 贪心算法深度分析 ... 常用十大贪心算法 ... 贪心算法有哪些算法 ... 贪心算法经典例题注释 ... 贪心算法四种思想 ... 贪心算法背包问题例题 ... 贪心算法策略 ... 贪心算法活动安排问题例题 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网