貪心演算法
一種求最優解的方法,它是按照某種最優策略,把複雜的問題層層分解成子問題(每次一般只有乙個),並由子問題的最優解「回溯」出整個問題的最優解。
首先應注意在解題時首先要看題目是否符合貪心策略,(如果乙個問題可以同時用幾種方法解決,就可以用貪心演算法)
再看如何選擇貪心標準來求取最優解。
貪心演算法大意為從乙個初始的出發點開始,逐漸逼近題目給定的目的,快速求解得更好的答案。
貪心演算法好像不能用來求最大最小解類似的問題;
適用範圍感覺較小,但方法簡便;
舉例說明;
經典揹包型別問題
給定乙個載重量為m的揹包,考慮n個物品,其中第i個物品的重量 ,價值wi (1≤i≤n),要求把物品裝滿揹包,且使揹包內的物品價值最大。
解題思路:
當我看到這個題,讓揹包內的物品價值最大,首先可以想到物品的價效比,按照物品的價效比來選擇先裝哪一種,裝多少,通過把物品的價效比排序,再按照揹包的承載量裝取多少物品,直到揹包裝滿,這樣一來,揹包的物品價值最大。(這個基本的貪心想法還是很好理解的)
前提:揹包的稱重量為50;
假設有三個物品分別為:1,2,3;
它們 的 重量 分別 為 :10,20,30;
價值分別為:60,100,120;
可以得到價效比分別為:6,5,4;
首先,通過貪心演算法,1號物品的價效比最高,優先選擇1號,這樣揹包的稱重量還剩40;
然後,看價效比其次的2號,裝完後背包的稱重量還剩20;
最後,裝價效比最低的3號,把3號拆分重量為20;這樣揹包剛好裝滿且價值最大(貪心中物品可拆)。
建立資料結構:
一、揹包型別問題
struct baga[
1001];
存放物品的陣列
bool
cmp(bag a, bag b)
sort
(a, a+n, cmp)
;//用標準模板庫函式排序(使用stable_sort()函式,在價效比相同時保持輸入的順序)
double
knapsack
(int n, bag a,
double c)
//裝滿揹包的剩餘空間
if(i=1.0
*a[i]
.v*cleft/a[i]
.w;return b;
}
二、最少張錢的類似問題,
比如:找零錢問題,或交錢問題;
例:
對於人民幣的面值有1元 ,5元, 10元, 20元, 50元 ,100元,
輸入找零的錢,輸出找錢方案中最少張數的方案,
比如123元,最少是1張100的,1張20的,3張1元的,一共5張!
我的解題思路:
如果要使錢的張數最少,面值大的紙幣價效比高,每一步盡可能用面值大的紙幣,面值大的紙幣占用零錢總體相對較多,最後再選擇面值小的紙幣充當零頭。
這樣就可以保證錢的張數最少。(感覺這個跟揹包問題類似)
首先我們在程式中已經事先將錢的價值按照從小到大的順序排好。
const
int n =7;
int count[n]=;
// 紙幣對應面值的數量
int value[n]=;
// 對紙幣價值排序
int ans=0;
void
solve
(int money)}if
(money >0)
else
}
三、字典序最小問題
給定長度為n的字串s,要構造乙個長度為n字串t。t是乙個空串,反覆執行下列任意操作:
從s的頭部刪除乙個字元,加到t的尾部;
從s的尾部刪除乙個字元,加到t的尾部;
目標是要構造字典序盡可能小的字串t。
字典序(指從前到後比較兩個字串的大小的方法。首先比較第1個字元,如果不同則第1個字元較小的字串更小,如果相同則繼續比較第2個字元…反覆繼續,來比較整個字串的大小。)
從字串性質上看,無論t的末尾多大,只要前面部分的較小即可。
把『不斷取s得開頭和末尾中較小的乙個字元放到t的末尾』作為貪心法所遵循的策略。
思路:
按照字典序比較s和將s反轉後的字串s』。
如果s較小,從s的開頭取出乙個字,追加到t的末尾。
如果s較小,從s的末尾取出乙個字,追加到t的末尾。(如果相同,則取誰都可以)
int
main()
else
if(s[a+i]
>s[b-i])}
//左右兩邊誰大輸出誰
if(left)
putchar
(s[a++])
;else
putchar
(s[b--])
;}return
0;
四、分發餅乾問題
你想要給你的孩子們一些小餅乾。
但是,每個孩子最多只能給一塊餅乾。對每個孩子i,都有乙個胃口值gi,這是能讓孩子們滿足胃口的餅乾的最小尺寸;
並且每塊餅乾j,都有乙個尺寸sj。如果sj >= gi,我們可以將這個餅乾j分配給孩子i,這個孩子會得到滿足。
你的目標是盡可能滿足越多數量的孩子,並輸出這個最大數值。
注意:你可以假設胃口值為正。乙個小朋友最多只能擁有一塊餅乾。
原則:大尺寸的餅乾分給胃口大的孩子。
int
findcontentchildren
(vector<
int>
& g, vector<
int>
& s)
i--;}
else
}return res;
}
學習的小結:
因為用貪心演算法只能通過解區域性最優解的策略來達到全域性最優解,因此,一定要注意判斷問題是否適合採用貪心演算法策略,找到的解是否一定是問題的最優解。
剛開始通過老師講貪心演算法的時候,還是很懵逼的,不明白是個什麼概念,本來以為和遞迴差不多像是一種解題模式,之後通過接觸題目才明白,貪心演算法是一種想法,幫助你解題的解出最優解的一種解題思路和方法。
不管現在自己有多菜,經過努力,我想我一定能夠學懂和掌握這門課,學到知識提公升自己。
世上無難事,只要肯登攀。;;;
;;;;
所 謂 貪 心,即 盡 所 能 的 做 到 最 優 做 到 最 好 。
總結 貪心演算法 貪心演算法入門總結
英語 greedy algorithm,又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。貪心演算法在有最優子結構的問題中尤為有效。最優子結構的意思...
貪心演算法2
在求最優解問題的過程中,依據某種貪心標準,從問題的初始狀態出發,直接去求解每一步的最優解,通過若干次的貪心選擇,最終得出整個問題的最優解,這種求解方法就是談心演算法。從貪心演算法的定義可以看出,貪心法並不是從整體上考慮問題,它所做出的選擇只是在某中意義上的區域性最優解,而由問題自身的特性決定了該題運...
貪心演算法(2)
題目描述 通過懸崖的yifenfei,又面臨著幽谷的考驗 幽谷周圍瘴氣瀰漫,靜的可怕,隱約可見地上堆滿了骷髏。由於此處長年不見天日,導致空氣中布滿了毒素,一旦吸入體內,便會全身潰爛而死。幸好yifenfei早有防備,提前備好了解藥材料 各種濃度的萬能藥水 現在只需按照配置成不同比例的濃度。現已知yi...