貪心演算法初步

2021-10-20 15:51:47 字數 2935 閱讀 3848

二、區間貪心

求解最優化問題的方法,總是考慮區域性最優(較優)的策略,使得全域性結果達到最優(較優)

想要獲得最優解往往需要對才用的策略進行證明,一般採用反證或者是數學歸納法

在考試過程中,如果沒有時間想到嚴謹的證明,如果在想到某個可行的策略且短時間內沒有想出反例推翻它,則勇敢實現即可。

月餅是中國人在中秋佳節時吃的一種傳統食品,不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需求量,請你計算可以獲得的最大收益是多少。

注意:銷售時允許取出一部分庫存。樣例給出的情形是這樣的:假如我們有 3 種月餅,其庫存量分別為 18、15、10 萬噸,總售價分別為

75、72、45 億元。如果市場的最大需求量只有 20 萬噸,那麼我們最大收益策略應該是賣出全部 15 萬噸第 2 種月餅、以及 5 萬噸第

3 種月餅,獲得 72 + 45/2 = 94.5(億元)

輸入格式: 每個輸入包含乙個測試用例。每個測試用例先給出乙個不超過 1000 的正整數 n 表示月餅的種類數、以及不超過

500(以萬噸為單位)的正整數 d 表示市場最大需求量。隨後一行給出 n 個正數表示每種月餅的庫存量(以萬噸為單位);最後一行給出 n

個正數表示每種月餅的總售價(以億元為單位)。數字間以空格分隔。

輸出格式: 對每組測試用例,在一行中輸出最大收益,以億元為單位並精確到小數點後 2 位。

輸入樣例: 3 20 18 15 10 75 72 45

輸出樣例: 94.50

# include

# include

# include

using

namespace std;

struct info

;//定義建構函式};

bool

cmp(info a, info b)

intmain()

for(

int i=

0; i)sort

(stock.

begin()

,stock.

end(

),cmp)

;for

(int i=

0; i)else

}printf

("%.2lf"

,max_profit)

;}

給定數字 0-9 各若干個。你可以以任意順序排列這些數字,但必須全部使用。目標是使得最後得到的數盡可能小(注意 0 不能做首位)。例如:給定兩個 0,兩個 1,三個 5,乙個 8,我們得到的最小的數就是 10015558。現給定數字,請編寫程式輸出能夠組成的最小的數。

輸入格式: 輸入在一行中給出 10 個非負整數,順序表示我們擁有數字 0、數字 1、……數字 9 的個數。整數間用乙個空格分隔。10

個數字的總個數不超過 50,且至少擁有 1 個非 0 的數字。

輸出格式: 在一行中輸出能夠組成的最小的數。

輸入樣例: 2 2 0 0 0 3 0 0 1 0

輸出樣例: 10015558

# include

intmain()

}for

(int i=

0;i<

10;i++

)}

區間不相交問題:給出n個開區間,從中選出盡可能多的開區間,使得這些區間兩兩之間沒有交集。

以(1,3),(1,2),(2,3),(3,5),(4,6),(6,7),(3,8)作為輸入為例

1.先對區間進行排序,假設區間記為(begin,end),我們按照begin公升序排序,當begin相同時,end降序排序(為什麼end降序排序,後面就會知道了):

此時排序結果為(1,3),(1,2),(2,3),(3,8),(3,5),(4,6),(6,7)

2.對於那些被包含的區間,例如(1,2)包含於(1,3)之中,那麼我們會選擇(1,2),因為(1,3)占用範圍大,會減少區間的個數;故在這一步我們需要將包含其他區間的區間丟棄

此時獲得結果為(1,2),(2,3),(3,5),(4,6),(6,7)

3.接著我們只需要遍歷剩餘的結果,保證後序的begin值大於前者的end值,就能夠輸出出結果

# include

# include

# include

using

namespace std;

struct section};

bool

cmp(section a, section b)

intmain()

sort

(aset.

begin()

,aset.

end(

),cmp)

;//從小到大排序

for(

int i=

0;isize()

-1;i++

) result.

push_back

(aset[0]

);last_end = aset[0]

.end;

for(

int i=

1;isize()

;i++)}

for(vector

::iterator it = result.

begin()

;it!=result.

end(

);it++

)printf

("(%d,%d) ",(

*it)

.begin,

(*it)

.end)

;}

讀書筆記 貪心演算法初步學習

0622 0627讀書筆記 貪心演算法初步學習 問題描述 123 假設有n個活動,這些活動有起止時間,這些活動都要使用同乙個如教室這樣的資源。每次 只能有乙個活動使用該資源。我們定義兩個活動起止時間不相交,則稱這兩個活動是相容 的。求乙個最大相容活動。演算法思路 1 2我們採取的策略是始終選取結束時...

經典貪心演算法 貪心演算法概述

貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...

演算法 貪心演算法

把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...