貪心演算法和動態規劃

2022-07-29 06:15:12 字數 2554 閱讀 9817

貪心演算法:在求解問題時,總是做出在當前看來做好的選擇,所以它是區域性最優解,試圖通過區域性最優推出全域性最優。需要注意的是貪心演算法沒有固定的演算法框架,演算法設計的關鍵是選擇貪心策略,其必須具備無後效性,即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。

常見的用貪心演算法解決的問題,比如教師排課系統,任務排程。

eg:現在有乙個場地,明天有n個活動,給出n個活動的開始和結束時間,如何安排最多場次的活動?

針對上面的問題,我們要選出一種貪心策略,比如選擇越早開始的活動優先順序高,或者越早結束的活動優先順序高,或者占用時間最短的活動優先順序高,沒有固定的框架,要更多的進行窮舉找到相對合適的貪心策略。

現在我們認為,越早開始,活動次數就越多:

public

class

activitygreedy }}

}@getter

@tostring

class

activity

}

輸出結果:

activity(num=3, start=8, end=9)

activity(num=2, start=9, end=10)

activity(num=1, start=10, end=12)

activity(num=4, start=12, end=14)

activity(num=6, start=14, end=15)

這就是以我們選擇的貪心策略,最終給我們計算的最優解。 

上面的問題,用貪心演算法可以處理,但是有些情況,我們一定要拿到最優解,這樣就不能使用貪心演算法了,這時候就要用到動態規劃的演算法思想。

動態規劃的基本思想:問題可以分解成子問題,子問題可以重複,針對子問題求最優解,最終得到原問題的最優解。

揹包問題:乙個揹包,容量50kg,三個物品,分別是10kg/30元,20kg/50元,40kg/60元,物品不能分割,且每件物品只能拿一件,如何獲取最大價值?

動態規劃求解的核心在於找到狀態轉移方程:

把5kg的袋子,按照1kg累加計算

10kg

20kg

30kg

40kg

50kg

加物品1

30 30

3030

30加物品2

3050

30+50=80

80 80

加物品3

3050

30+50=80

8030+60=90

上面表示的是:在當前重量下,加入某商品時,產生的最大價值。能裝這個物品的時候,和上面的價值比較,大的話就裝,小就不裝。

定義金額陣列value,重量陣列weight,商品遍歷下標i,能獲取到狀態轉移方程:

math.max(value[i] + res[i][j - weight[i]], res[i-1][j]);

公式翻譯成**:

public

static

void

main(string args) ;

//商品重量

int weight = ;

//計算結果,使用二維陣列儲存當前重量下裝到當前物品時的最大價值

int res = new

int[3 + 1][w + 1];

//兩層迴圈,第一層是每次要增加的物品

for (int i = 1; i <= n; i++)

//當前重量裝不下當前物品,最大重量和沒裝這個物品時一樣

else}}

system.out.println(res[3][w]);

}

輸出結果:90

再看乙個示例,比如購物車有n件商品,現在中獎了,可清除購物車,額度10000元,如何使現有商品清除總額最高?

public

static

void

main(string args)

else}}

//輸出最大總額

system.out.println(res[value.size()][max]);

//輸出具體選了哪些商品:邏輯是,最後乙個商品和倒數第二個商品,在10000額度的時候如果前者總額大於後者總額,說明最後乙個品可清除,以此類推

int temp =max;

for (int i = value.size(); i >= 1; i--) }}

@getter

@tostring

class

item

}

輸出結果:

額度:9997

item(name=冰箱, value=1673)

item(name=馬桶, value=1492)

item(name=淨化器, value=2102)

item(name=鍵盤, value=632)

item(name=耳機, value=1099)

item(name=手機, value=2999)

以上就是個人對貪心演算法和動態規劃的理解。

動態規劃和貪心演算法

動態規劃 通過組合子問題的解來求解原問題,常用來求解最優化問題。常用來解決以下幾類問題,但不是說遇到類似問題必須用動態規劃來解決,可以往這方面去想 1.計數問題,如有多少種方式走到右下角,有多少種方法選出k個數使得和是sum 2.求最大最小值,如從左上角走到右下角路徑的最大數字和 3.求存在性,如取...

貪心演算法 and 動態規劃

動態規劃dynamic programming 貪心演算法,又名貪婪法,是尋找最優解問題的常用方法 步驟1 從某個初始解出發 步驟2 採用迭代的過程,當可以向目標前進一步時,就根據區域性最優策略,得到一部分解,縮小問題規模 步驟3 將所有解綜合起來。假設你開了間小店,不能電子支付,錢櫃裡的貨幣只有 ...

動態規劃和貪心演算法對比

動態規劃和貪心演算法都是一種遞推演算法 均有區域性最優解來推導全域性最優解 不同點 貪心演算法 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而上一部之前的最優解則不作保留。2.由 1 中的介紹,可以知道貪心法正確的條件是 每一步的最優解一定包含上...