概念:簡單來說,貪心演算法就是貪心,在求解的時候步步貪心,步步求得最優解,直至結束時求得想要的最優解。因此貪心演算法起初考慮的並非整體,而是區域性的最優解。如果乙個問題可以同時用幾種方法解決,貪心演算法應該是最好的選擇之一。
因為我們使用貪心演算法,每次都得到其子問題的最優解,所以這裡引入最優子結構的概念:
當乙個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。問題的最優子結構性質是該問題可用貪心演算法或動態規劃演算法求解的關鍵特徵。
利用貪心策略解題,需要解決兩個問題:
(1)該題是否適合於用貪心策略求解;
(2)如何選擇貪心標準,以得到問題的最優/較優解。
貪心演算法的基本流程(模型):
//a是問題的輸入集合即候選集合
greedy(a)
; //初始解集合為空集
while (not solution(s)) //集合s沒有構成問題的乙個解
; a = a-;
} return s;
}
(1)候選集合a:問題的最終解均取自於候選集合a。
(2)解集合s:解集合s不斷擴充套件,直到構成滿足問題的完整解。
(3)解決函式solution:檢查解集合s是否構成問題的完整解。
(4)選擇函式select:貪心策略,這是貪心演算法的關鍵。它指出哪個候選物件最有希望構成問題的解,選擇函式通常和目標函式有關。
(5)可行函式feasible:解集合擴充套件後是否滿足約束條件。
貪心演算法問題應用:
揹包問題,最優裝載問題
刪數問題
多處最優服務次序問題
moving tables
均分紙牌
整數區間
看守倉庫
gone fishing(普通貪心實現)(貪心與優先佇列)
對於例題,將會在下次部落格中進行部分介紹。
貪心演算法 部分 題目解題報告
poj 2231 include include include using namespace std int main sort a,a n 1 按照從大到小排列輸入的元素 for int i 1 i n i c 2 d b cout 對輸入的數字排序,由於要求數字之間的距離應該想到絕對值的運用...
貪心知識點
基本知識點 適用於最優化問題的演算法往往包含一系列步驟,每一步都有一組選擇。對很多最優化問題來說,採取動態規劃方法來決定最佳選擇就有點 殺雞用牛刀 了,一般只要採用另一些更簡單有效的演算法就行了。貪心演算法是使所做的選擇看起來都是當前最佳的,希望通過所做的區域性最優來產生乙個全域性最優解。貪心演算法...
OC 部分知識點
public 共有的 protected 受保護的,oc預設 private 私有的 記憶體問題體現兩個方面 1,記憶體洩漏 2,野指標 父物件在自己的生命週期內 一定會強引用自己的子物件 子物件一定不能反過來強引用父物件 強引用 指讓子物件計數器加一 如果子物件和父物件能相互引用 會形成迴圈引用!...