greedy演算法基本思想:
貪心演算法是一種在每一步選擇中都採取在當前狀態下最好或最優的選擇,從而希望結果是最好或最優的結果。
希望通過做出區域性優化選擇達到全域性優化選擇。
演算法不一定總產生優
化解。
greedy演算法產生優化解的條件:
具有優化子結構;
具有貪心選擇性;
優化子結構:若乙個優化問題的優化解包含它的(剩餘)子問題的優化解,則稱其具有優化子結構。
貪心選擇性:乙個優化問題的全域性優化解可以通過區域性優化選擇得到。
貪心演算法的求解過程
(1)候選集合a:為了構造問題的解決方案,有乙個候選集合a作為問題的可行解,即問題的最終解均取自候選集合a。
(2)解集合s:隨著貪心選擇的進行,解集合s不斷擴充套件,直到構成滿足問題的完整解。
(3)解決函式solution:檢查解集合s是否構成問題的完整解。
(4)選擇函式select:即貪心策略,這是關鍵,指出哪個候選物件最有希望構成問題的解,通常和目標函式有關。
(5)可行函式feasible:檢查解集合中加入乙個候選物件是否可行,即解集合擴充套件後是否滿足約束條件。
貪心演算法的一般流程:
greedy(a)
; //初始集合為空集
while(not solution(s)) //集合s沒有構成問題的乙個解
; a = a - ;
} }return s;
}
下面舉幾個例子:
1、最大連續子陣列和:在乙個整數陣列中,求和最大的子陣列的值。
#include#include#includeusing namespace std;
/*最大連續子陣列和*/
int maxsubarray(vector& vec)
if(sum < 0)//若陣列中均為負數,則尋找乙個最大值返回
sum = candy[ratings.size()-1];
for(i=ratings.size()-2;i>=0;i--)
return sum;
}int main()
; vectorvec(array,array+sizeof(array)/sizeof(int));
cout<3、跳遠遊戲,給定乙個整數陣列,陣列中的元素代表在當前位置能夠向前跳的最遠距離,判斷給定的這個跳遠策略能否跳到最後的位置。
#include#includeusing namespace std;
/*時刻計算當前位置和當前位置能跳的最遠長度,並始終和界限比較
若在任意位置出現在最遠跳步為0,那麼就無法繼續跳下去,
在任意位置出現最大跳步+當前位置》界限,那麼就說明可以跳下去*/
bool canjump(vector& vec)
}int main()
; vectorvec(array,array+sizeof(array)/sizeof(int));
cout<
貪心演算法理論概述
基本概念 貪心策略是指從問題的初始狀態出發,通過若干次貪心選擇得出最優值 或較優解 的一種解法 其實,從 貪心策略 一詞可以看出,貪心策略總是做出在當前看來最優的選擇。也就是說,貪心策略並不是從整體上 考慮問題,他所作的選擇只是在某種意義上的區域性最優解,而許多問題自身的特性決定了該題運用貪心策略可...
演算法基礎 貪心演算法
貪心演算法是常見的基礎演算法,它在求解問題時總想用當前看來最好的方法去實現,而到了下一步,再用下一步時最好的方法來解決,因此有了貪心的名字。此方法不從整體去考慮,僅是在某種意義上的區域性最優求解。雖然貪心演算法不是對所有的問題都能得到整體最優解,但是面對範圍相當廣泛的很多問題時,能產生整體最優解或是...
基礎演算法 貪心演算法
概述 貪心演算法是從問題的初始狀態出發,通過若干次的貪心選擇而得到的最優值的一種求解策略,即貪心策略。簡單來說,貪心策略是一種在每次決策時採取當前意義下最優策略的演算法,做出的選擇至少在某種約束條件下的區域性最優解或較優解,並不一定是全域性的最優解或較優解,但在某些特定的情況下,可以利用貪心演算法來...