資料結構與演算法(6)貪心法

2021-10-04 10:52:49 字數 1930 閱讀 4757

貪心法(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...