《資料結構與演算法之美》31 貪心演算法

2022-07-01 18:09:12 字數 1293 閱讀 6790

貪心演算法(英語:greedy algorithm),又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的演算法。

——維基百科

貪心演算法與動態規劃的不同在於它對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會儲存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。

實際上,貪心演算法適用的場景比較有限。這種演算法思想更多的是指導設計基礎演算法。比如最 小生成樹演算法、單源最短路徑演算法,這些演算法都用到了貪心演算法。

第一步,當我們看到這類問題的時候,首先要聯想到貪心演算法:針對一組資料,我們定義了限制值和期望值,希望從中選出幾個資料,在滿足限制值的情況下,期望值最大。

第二步,我們嘗試看下這個問題是否可以用貪心演算法解決:每次選擇當前情況下,在對限制 值同等貢獻量的情況下,對期望值貢獻最大的資料。

第三步,我們舉幾個例子看下貪心演算法產生的結果是否是最優的。

問題:我們有m個糖果和n個孩子。我們現在要把糖果分給這些孩子吃,但是糖果少,孩子多 (m < n),所以糖果只能分配給一部分孩子。

抽象:從n個孩子中,抽取一部分孩子分配糖果,讓滿足的孩子的個數 (期望值)是最大的。這個問題的限制值就是糖果個數m。

解題思路:從需求小的孩子開始分配糖果。

問題:假設我們有1元、2元、5元、10元、20元、50元、 100元這些面額的紙幣,它們的張數分別是c1、c2、c5、c10、c20、c50、c100。我們現在 要用這些錢來支付k元,最少要用多少張紙幣呢?

解題思路:是先用面值最大的來支付,如果不夠,就繼續用更小一點面值的,以此 類推,最後剩下的用1元來補齊

問題:假設我們有n個區間,區間的起始端點和結束端點分別是[l1, r1],[l2, r2],[l3, r3],……,[ln, rn]。我們從這n個區間中選出一部分區間,這部分區間滿足兩兩不相交(端點相交的情況不算 相交),最多能選出多少個區間呢?

解題思路:

我們假設這n個區間中最左端點是lmin,最右端點是rmax。這 個問題就相當於,我們選擇幾個不相交的區間,從左到右將[lmin, rmax]覆蓋上。我們按照起 始端點從小到大的順序對這n個區間排序。

我們每次選擇的時候,左端點跟前面的已經覆蓋的區間不重合的,右端點又盡量小的,這樣 可以讓剩下的未覆蓋區間盡可能的大,就可以放置更多的區間。

資料結構與演算法之美(筆記22)貪心演算法

假設我們有乙個可以容納100kg物品的揹包,可以裝各種物品。我們有以下5種豆子,每種豆子的總量和總價值都不一樣。為了讓揹包中所裝物品的總價值最大,我們應該在揹包中裝哪些豆子?豆子又該裝多少?我們只要算一算每個物品的單價,按照單價由高到低依次來裝就好了。單價依次是 黑豆,綠豆,紅豆,青豆,黃豆。所以,...

資料結構與演算法 貪心演算法

1 給定 n 種物品和乙個揹包,物品 i 的重量是 w i 其價值是 p i 揹包的容量為 c。設物品已按單位重量價值遞減的次序排序。每種物品不可以裝入揹包多次,但可以裝入部分的物品 i。揹包問題是選擇裝入揹包中的物品,在不超過揹包容量的前提下使揹包的得總價值最大。用貪心法設計與實現乙個演算法,求解...

資料結構與演算法 貪心演算法

定義每個古董重量 揹包問題 在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解 是否是全域性最優,需要證明 有一天海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件都價值連城,一旦打碎就是去了價值,海盜船載重量為c,每件固定的重量為w...