貪心法(greedymethod)是把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每一步選擇都是對當前解的乙個擴充套件,直到獲得問題的完整解。
正如其名字一樣,貪心法在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果,這個選擇都不會改變。
例如用貪心法求解付款問題:假設有面值為的貨幣若干張,需要付款4元6角現金,如何付款才能使付出貨幣的數量最少?
款問題的貪心選擇策略是,在不超過應付款金額的條件下,選擇面值最大的貨幣。
首先選出1張面值不超過4元6角的最大面值的貨幣,即2元;
再選出1張面值不超過2元6角的最大面值的貨幣,即2元;
再選出1張面值不超過6角的最大面值的貨幣,即5角;
再選出1張面值不超過1角的最大面值的貨幣,即1角。
總共付出4張貨幣。
顯然,貪心法的關鍵是設計合理的貪心選擇策略。在本書中,哈夫曼演算法、prim演算法、kruskal演算法、dijkstra演算法等都是貪心法的應用例項。
埃及同中國一樣,也是世界文明古國之一。
古埃及人只用分子為1的分數,在表示乙個真分數時,將其分解為若干個埃及分數之和,
例如:7/8表示為1/2+1/3+1/24。
設計程式把乙個真分數表示為最少的埃及分數之和的形式。
【想法】 乙個真分數的埃及分數表示不是唯一的,例如:7/8又可以表示為1/8+1/8+1/8+1/8+1/8+1/8+1/8。
顯然,把乙個真分數表示為最少的埃及分數之和的形式,其貪心策略是選擇真分數包含的最大埃及分數,
以7/8為例,7/8>1/2,則1/2是第一次貪心選擇的結果;
7/8-1/2=3/8>1/3,則1/3是第二次貪心選擇的結果;
7/8-1/2-1/3=1/24,則1/24是第三次貪心選擇的結果,
即7/8=1/2+1/3+1/24。
接下來的問題是:如何找到真分數包含的最大埃及分數?設真分數為a/b,b除以a的整數部分為c,餘數為d,則有下式成立:
b=ac+d
即b/a=c+d/a<c+1
則a/b>1/(c+1)
1/(c+1)即為真分數a/b包含的最大埃及分數。
設e=c+1,由於a/b-1/e=(ae-b)/(be)
則真分數減去最大埃及分數後,得到真分數(ae-b)/(be),該真分數可能存在公因子,需要化簡,可以將分子和分母同時除以最大公約數。
【演算法】 設函式egyptfraction實現埃及分數問題,其演算法描述如下 :
【程式】 主函式首先接收從鍵盤輸入的分子a和分母b,然後呼叫函式egyptfraction將該真分數表示為埃及分數之和,在表示過程中需要呼叫函式commonfactor求a和b的最大公約數並對a/b進行化簡。
程式如下:
#include
void
egyptfraction
(int a,
int b )
;// 埃及分數
intcommonfactor
(int m,
int n )
;// 求最大公約數
資料結構與演算法 貪心演算法
1 給定 n 種物品和乙個揹包,物品 i 的重量是 w i 其價值是 p i 揹包的容量為 c。設物品已按單位重量價值遞減的次序排序。每種物品不可以裝入揹包多次,但可以裝入部分的物品 i。揹包問題是選擇裝入揹包中的物品,在不超過揹包容量的前提下使揹包的得總價值最大。用貪心法設計與實現乙個演算法,求解...
資料結構與演算法 貪心演算法
定義每個古董重量 揹包問題 在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解 是否是全域性最優,需要證明 有一天海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件都價值連城,一旦打碎就是去了價值,海盜船載重量為c,每件固定的重量為w...
資料結構與演算法 貪心演算法
有如下場景 針對一組資料,我們定義了限制值和期望值,希望從中選出幾個資料,在滿足限制值的情況下,期望值最大。為了達到上述目的,貪心演算法是其中的乙個解決方案。例如,路徑選擇問題,從 s 城市至 e 城市,在只能路過 2 個城市的情況下,如何走的最短,如下圖所示 英文全稱 greedy algorit...