筆記整合 貪心演算法

2021-09-23 20:39:44 字數 1611 閱讀 2208

假設有乙個可以容納100kg物品的揹包,可以裝各種物品。有以下5種豆子,每種豆子的總量和總價值都各不相同。為了讓揹包中所裝物品的總價值最大,如何選擇在揹包中裝哪些豆子?每種豆子又該裝多少呢?

只要先算一算每個物品的單價,按照單價由高到低依次來裝就好了。單價從高到低排列,依次是:黑豆、綠豆、紅豆、青豆、黃豆,所以可以往揹包裡裝20kg黑豆、30kg綠豆、50kg紅豆。

貪心演算法解決問題的步驟

實際上,用貪心演算法解決問題的思路,並不總能給出最優解。

我們從頂點s開始,找一條到頂點t的最短路徑(路徑中邊的權值和最小)。貪心演算法的解決思路是,每次都選擇一條跟當前頂點相連的權最小的邊,直到找到頂點t。按照這種思路,我們求出的最短路徑是s->a->e->t,路徑長度是1+4+4=9。但是,這種貪心的選擇方式,最終求的路徑並不是最短路徑,因為路徑s->b->d->t才是最短路徑,因為這條路徑的長度是2+2+2=6。

在這個問題上,貪心演算法不工作的主要原因是,前面的選擇,會影響後面的選擇。如果我們第一步從頂點s走到頂點a,那接下來面對的頂點和邊,跟第一步從頂點s走到頂點b,是完全不同的。所以即便第一步選擇最優的走法(邊最短),但有可能因為這一步選擇,導致後面每一步的選擇都很糟糕,最終也就無緣全域性最優解了。

1.分糖果

有m個糖果和n個孩子。現在要把糖果分給這些孩子吃,但是糖果少,孩子多(m2.錢幣找零

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

在生活中,肯定是先用面值最大的來支付,如果不夠,就繼續用更小一點面值的,以此類推,最後剩下的用1元來補齊。在貢獻相同期望值(紙幣數目)的情況下,希望多貢獻點金額,這樣就可以讓紙幣數更少,這就是一種貪心演算法的解決思路。

3.區間覆蓋

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

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

每次選擇的時候,左端點跟前面的已經覆蓋的區間不重合的,右端點又盡量小的,這樣可以讓剩下的未覆蓋區間盡可能的大,就可以放置更多的區間。這實際上就是一種貪心的選擇方法。

貪心演算法 筆記

揹包相關問題。1.給出n 個物品,第i 個物體的重量為wi 選擇盡量多的物體,使得總重量不超過 c 按照物品重量從到小排序 2.部分揹包問題。有 n個物體,第 i 個物體的重量為wi 價值為vi 在總重量超過c的情況下讓總價值盡量高。按照 價值除以重量的值 排序 乘船問題。有 n 個人,第 i個人的...

貪心演算法筆記

貪心演算法總是作出在當前看來最好的選擇,所作出的選擇只是在某種意義上的區域性最優選擇。雖然貪心演算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。在一些情況下,即使貪心演算法不能得到整體最優解,其最終結果卻是最優解的很好近似。貪心演算法和動態規...

leetcode 貪心演算法筆記

題目 此題的貪心演算法解法如下。def maxsubarray nums cur sum nums 0 max sum nums 0 for i in range 1 len nums cur sum max nums i cur sum nums i max sum max cur sum,max...