演算法筆記 簡單貪心(月餅問題)

2021-08-15 02:08:19 字數 2293 閱讀 8013

**

貪心法是求解一類最優問題的方法,它總是考慮當前狀態下區域性最優(或較優)的策略,來使全域性的結果達到最優(或較優)。顯然,如果採取較優而非最優的策略(最優策略可能不存在或是不易想到),得到的全域性結果也無法是最優的。而要獲得最優結果,則要求中間的每步策略都是最優的,因此嚴謹使用貪心法來求解最優化問題需要對採取的策略進行證明。證明的一般思路是使用反證法和數學歸納法,即假設策略不能導致最優解,然後通過一系列推導來得到矛盾,以此證明策略是最優的。不過對平常使用來說,也許沒有時間或者不太容易對想到的策略進行嚴謹的證明(貪心的證明往往比貪心本身更難),因此一般來說,如果在想到某個似乎可行的策略,並且自己無法舉出反例,那麼就勇敢的實現它。

例1:月餅

題目描述

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

注意:銷售時允許取出一部分庫存。樣例給出的情形是這樣的:假如有三種月餅,其庫存量分別為18,15,10萬噸,總售價分別為75,72,45億元。如果市場的最大需求量只有20萬噸,那麼最大收益策略應該是賣出全部的15萬噸第二種月餅以及5萬噸第三種月餅,獲得72+45/2=94.5(億元)。

輸入格式

每個輸入包含1個測試用例。每個測試用例先給出乙個不超過1000的正整數n表示月餅的種類數以及不超過500(以萬噸為單位)的正整數d表示市場最大需求量;隨後一行給出n個正數表示每種月餅的庫存量(以萬噸為單位);最後一行給出n個正數表示每種月餅的總售價(以億元為單位)。數字間以空格分割。

輸出格式

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

輸入樣例

3 20

18 15 10

75 72 45

輸出樣例

94.50

題意

現有月餅需求量為d,已知n種月餅各自的庫存量和總售價,問如何銷售這些月餅,使得可以獲得的受益最大。求最大收益。

思路

步驟1:這裡採用「總是選擇單價最高的月餅**,可以獲得最大的利潤」的策略。

因此,對每種月餅,都根據起庫存量和總售價來計算出該種月餅的單價。

之後,將所有月餅按單價從高到低排序。

步驟2:從單價高的月餅開始列舉。

①如果該種月餅的庫存量不足以填補所有的需求量,則將該種月餅全部賣出,此時需求量減少該種月餅的庫存量大小,收益值增加該種月餅的總售價大小。

②如果該種月餅的庫存量足夠**需求量,則只提供需求量大小的月餅,此時收益值增加當前需求量乘以該種月餅的單價,而需求量減為0.

這樣,最後得到的收益值即為所求的最大收益值。

策略正確性的證明:假設有兩種單價不同的月餅,其單價分別為a和b(a < b)。如果當前需求量為k,那麼兩種月餅的總收入分別為ak和bk,而ak < bk顯然成立,因此需要**單價更高的月餅。

注意點

①月餅庫存量和總售價可以是浮點數(題目中只說是正數,沒說是正整數),需要用double型儲存。對於,總需求量d雖然題目說是正整數,但是為了後面計算方便,也需要定義為浮點型。很多得到「答案錯誤」的**都錯在這裡。

②當月餅庫存量高於需求量時,不能先令需求量為0,然後再計算收益,這會導致該步收益為0。

③當月餅庫存量高於需求量時,要記得將迴圈中斷,否則會出錯。

參考**

#include

#include

using

namespace

std;

struct mooncakecake[1010];

bool cmp(mooncake a,mooncake b)

int main()

for(int i = 0;i < m; i++)

sort(cake,cake + n,cmp);//單價從高到低排序

double ans = 0;//收益

for(int i = 0;i < n;i ++)else

}printf("%.2f\n",ans);

return

0;}

摘自《演算法筆記》胡凡,曾磊主編

(貪心演算法)PTA 裝箱問題 月餅問題

1.裝箱問題 輸入樣例 860 70 80 90 30 40 10 20 輸出樣例 60 1 70 2 80 3 90 4 30 1 40 5 10 1 20 2 5 include intmain for int i 0 i for int j 0 jprintf d n xsum return0...

1020 月餅(簡單貪心)

題目鏈結 思路 計算出每種月餅的單價,按照單價排序。只要還有最貴的月餅,就賣最貴的,直到賣完。老奸商了 include include include include include include using namespace std struct mooncake 定義mooncake結構體,...

L2 003 月餅 (簡單貪心演算法)

時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 月餅是中國人在中秋佳節時吃的一種傳統食品,不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量 總售價 以及市場的最大需求量,請你計算可以獲得的最大收益是多少。注意 銷售時允許取...