演算法導論 第16章 貪心演算法

2021-10-21 10:29:04 字數 2271 閱讀 8347

結論貪心演算法,顧名思義,貪心就完事了。對於這種抽象的演算法,我的一貫想法是通過例項將其具體化。下面給出乙個例子,好好感受:

上題的解如下:

//鈔票支付問題(動態規劃法也可解)

//對於此問題需要注意的是,貪心法可能得出最優也可能無法得出全域性最優,這取決於硬幣的種類

#include

#include

using

namespace std;

intmain()

;//硬幣的幣值

int num = rmb.

size()

;//幣值種類

int x =

628;

//需要支付的總價值

int count =0;

//計數,記錄支付的硬幣數

for(

int i =

0; i < num; i++

) cout <<

"總共需要"

<< count <<

"張"<< endl;

return0;

}

貪心法:每一步都做出當時看起來是最佳的選擇。(注:有時候貪心演算法可能無法選到全域性最優的解。)

顯然光看字面上對貪心法的描述你可能覺得你懂了,實際上做題後又一頭霧水,下面結合一些例子我們對貪心演算法做更深入的學習。

題目:

題目分析:

貪心規則:用更小的糖果滿足小孩。

//糖果分配問題

#include

#include

#include

using

namespace std;

intmain()

;//孩子的需求

vector<

int> s =

;//糖果的大小

sort

(g.begin()

, g.

end())

;sort

(s.begin()

, s.

end())

;int child =0;

//child代表已經滿足了幾個孩子

int cookie =0;

//cookie代表已經嘗試了幾個糖果

while

(cookie <= s.

size()

-1&& child <= g.

size()

-1) cookie++;}

cout <<

"能夠滿足的小孩數量:"

<< child << endl;

return0;

}

題目大意:

貪心規則:每次找結束時間最小的活動。

//活動選擇問題

#include

#include

using

namespace std;

intmain()

; vector<

int> end =

;int now_end;

//已經確定可以進行的活動的結束時間

int count =1;

//最早結束的乙個活動

now_end = end[0]

;//第乙個活動選種,now_end=4,這是其他活動的起始時間限制,必須大於等於4

for(

int i =

1; i < end.

size()

; i++)}

cout << count << endl;

return0;

}

怎麼找貪心規則是重點,先這樣吧,以後再做到貪心演算法的題會更新於此。

演算法導論習題解 第16章貪心演算法

習題編號以第三版為準。對於活動選擇問題,並不是所有貪心方法都能得到最大相容活動子集。請舉例說明,每次選擇時間最短者,或最早開始者,或重疊的活動數量最小者,均不能得到最優解。使用最少的教室完成所有活動。用頂點表示活動,不相容的活動之間有一條邊。使用最少的顏色對頂點著色,使得任意邊的兩端顏色均不相同。i...

第16章 貪心演算法

求解最優化問題的演算法通常需要經過一系列的步驟,在每個步驟都面臨多重選擇,動態規劃演算法是通過比較這麼多選擇來得到乙個最優的選擇,而貪心演算法不用比較而是直接選出當時看起來最佳的選擇,通過做出區域性最優的選擇來得到全域性最優解。設計貪心演算法有如下三個步驟 證明貪心選擇是最優解的一部分 證明做出貪心...

演算法導論 13 貪心演算法

與動態規劃類似,貪心演算法也將問題化簡為規模較小的子問題,並通過遞迴解決子問題來獲取整個問題的解。不同的是,貪心問題不對子問題進行比較,而是只生成乙個非空的子問題,而使選擇在當時看上去是最優的 即 貪心 的含義 幾個互相競爭的活動都要求以獨佔的方式占用某個公用資源 如選修課程對個人可支配時間的要求,...