結論貪心演算法,顧名思義,貪心就完事了。對於這種抽象的演算法,我的一貫想法是通過例項將其具體化。下面給出乙個例子,好好感受:
上題的解如下:
//鈔票支付問題(動態規劃法也可解)
//對於此問題需要注意的是,貪心法可能得出最優也可能無法得出全域性最優,這取決於硬幣的種類
#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 貪心演算法
與動態規劃類似,貪心演算法也將問題化簡為規模較小的子問題,並通過遞迴解決子問題來獲取整個問題的解。不同的是,貪心問題不對子問題進行比較,而是只生成乙個非空的子問題,而使選擇在當時看上去是最優的 即 貪心 的含義 幾個互相競爭的活動都要求以獨佔的方式占用某個公用資源 如選修課程對個人可支配時間的要求,...