貪心法 選取當前最優策略

2021-09-02 07:50:26 字數 1936 閱讀 2377

貪心的特點是選取當前最優策略,這也帶來了缺點,當前的最優解不一定是最終的最優解。

1.硬幣問題

有1元、5元、10元、50元、100元、500元的硬幣各c1、c5、c10、c50、c100、c500枚。現在要用這些硬幣來支付a元,最少需要多少枚硬幣?假定本題至少存在一種支付方案。

樣例輸入

3 2 1 3 0 2 620

(c1、c5、........c500、a)

輸出(500+50*2+10+5*2)

#include#includeusing namespace std;

const int v[6]=;

int c[6];

int a;

void solve()

cout<>c[i];

cin>>a;

solve();

return 0;

}

2.區間排程問題

有n項工作,每項工作分別在si開始,ti結束。對每項工作,你都可以選擇參加或不參加,但選擇了參加某項工作就必須至始至終參加全程參與,即參與工作的時間段不能有重疊(即使開始的時間和結束的時間重疊都不行)。

樣例:輸入

n=5s=

t=輸出

3(選擇工作1, 3, 5)

對這個問題,如果使用貪心演算法的話,可能有以下幾種考慮:

(1)、每次選取開始時間最早的;

(#)、每次選取結束時間最早的;

(2)、每次選取用時最短的;

(3)、在可選工作中,每次選取與最小可選工作有重疊的部分;

只有演算法(#)是正確的。

對於(1):

對於(2):

對於(3):

具體證明如下:

數軸上有n個區間,選出最多的區間,使得這些區間不互相重疊。

演算法:將所有區間按右端點座標從小到大排序,順序處理每個區間。如果它與當前已選的所有區間都沒有重疊,則選擇該區間,否則不選。

證明:顯然,該演算法最後選出的區間不互相重疊,下面證明所選出區間的數量是最多的。設fi為該演算法所接受的第i個區間的右端點座標,gi為某最優解中的第i個區間的右端點座標。

命題1.1  當i>=1時,該演算法所接受的第i個區間的右端點座標fi<=某最優解中的第i個區間的右端點座標gi。

該命題可以運用數學歸納法來證明。對於i=1,命題顯然為真,因為演算法第乙個選擇的區間擁有最小右端點座標。令i>1,假定論斷對i-1為真,即fi-1<=gi-1。則最優解的第i個可選區間所組成的集合包含於執行該演算法時第i個可選區間所組成的集合;而當演算法選擇第i個區間時,選的是在可選區間中右端點座標最小的乙個,所以有fi<=gi。證畢。

設該演算法選出了k個區間,而最優解選出了m個區間。

命題1.2  最優解選出的區間數量m=該演算法選出的區間數量k。

假設m>k,根據命題1.1,有fk<=gk。由於m>k,必然存在某區間,在gk之後開始,故也在fk之後開始。而該演算法一定不會在選了第k個區間後停止,還會選擇更多的區間,產生矛盾。所以m<=k,又因為m是最優解選出區間個數,所以m=k。

綜上所述,演算法選出的區間是最優解。

#include#includeusing namespace std;

const int max_n=1e5;

int n,s[max_n],t[max_n];

pairitv[max_n];

void solve()

演算法 貪心法

動態規劃在某一步決定優化函式的最大或者最小值時候,需要考慮子問題的優化函式值,從中選出最優的結果。貪心法 也是多不判斷,不考慮子問題的計算結果,根據當時情況採取 只顧眼前的 貪心策略決定取捨,工作量少於動態規劃很多,更具效率 可導致區域性最優化而不是全域性優化 n項活動,使用同乙個禮堂問題 si 和...

演算法 貪心法

感謝華北電力大學王墨玉老師的ppt 基礎知識 應用條件 最優子結構性質 原問題包含了其子問題的最優解 對於乙個問題可能會有不同的量度標準,選擇其中可以獲得最優解的量度標準是貪心法設計的核心問題 例題活動安排問題 可求得最優解 int greedyselector int s,int f,int a ...

貪心法簡介

1.貪心法的設計思想 例 n項活動,每項活動有開始時間和結束時間,不能同時舉行,設計安排使得被安排的活動數量最多 策略 將活動結束時間從小到大排列,從前向後選擇,只要與前面的活動相容,就將活動選入a include using namespace std int s 100 e 100 d 100 ...