寫這篇博文的目的是因為對於貪心演算法一直沒有很深的理解,每次都會因為貪心演算法ac不了而頭疼。
貪心的主要思想
總是選擇「當前最好的選擇」,而不從整體上去把握的思想。貪心演算法在某種情況下的確能得到最優的結果。
題目的大致意思是:m元錢,n種物品,每種物品j磅,總價值f元,可以使用0到f的任意**購買相應磅的物品,例如使用0.3f元,可以購買0.3j磅物品。要求輸出用m元錢最多能買到多少磅物品。
輸入 :
輸入m元,n種物品,後輸入n種物品,以及每種物品對應的重量、總價值,輸入-1,-1結束輸入。
這題可以用貪心演算法求解,對於剩餘物品,每次都購買剩餘物品中價效比(即重量/**)最高的物品,直到該物品被買完,則我們繼續在剩餘的物品中尋找價效比最高的物品,重複該過程;若金錢耗盡,則交易結束。
下面證明是否能用貪心演算法求得最優解
按照貪心演算法的思想,如果存在價效比為a高的物品,那麼原物品中價效比高於a的物品一定全部被我們買下來。採用反證法,假設,存在著價效比b>a的物品沒有被買下來,但是我們獲得了最優解,此時,如果退掉了a而去購買b,那麼在同樣的價錢下,b的重量會明顯的大於a,也就是說a不是最優解。假設不成立,因此,按照貪心演算法求得的是最優解。
下面上**;
#include
#include
using namespace std;
struct goods
}buf[
1000];
int main()
sort
(buf,buf+n)
;//對物品進行排序
int idx=0;
//記錄貨物物品數
double ans=0;
//記錄貨物總重量
while
(m>
0&&idx
else
idx++;}
printf
("%.3lf\n"
,ans);}
return0;
}
#include
#include
using namespace std;
struct program
} buf[
100]
; int main()
for(int i=
0;i)sort
(buf,buf+n)
;//按照結束時間公升序排列
int currenttime=
0,ans=0;
//記錄當前時間變數的初始值為0,答案技術初始值為0
for(int i=
0;iprintf
("%d\n"
,ans);}
return0;
}
貪心演算法經典例子
貪心演算法總是作出在當前看來最好的選擇。也就是說貪心演算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的區域性最優選擇。基本思想 貪心演算法並不從整體最優上加以考慮,它所做的選擇只是在某種意義上的區域性最優解。基本要素 最優子結構性質和貪心選擇性質。和動態規劃區別 動態規劃演算法中,每步所做的...
貪心演算法幾個經典例子 關於貪心演算法,你該了解這些!
回溯結束,貪心正式開始,你準備好了麼?貪心的本質是選擇每一階段的區域性最優,從而達到全域性最優 這麼說有點抽象,來舉乙個例子 例如,有一堆鈔票,你可以拿走十張,如果想達到最大的金額,你要怎麼拿?指定每次拿最大的,最終結果就是拿走最大數額的錢。每次拿最大的就是區域性最優,最後拿走最大數額的錢就是推出全...
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...