貪心演算法(greedy algorithm)

2021-06-01 18:31:48 字數 1505 閱讀 9913

題1:100元,50元,20元,10元,5元,2元,1元。你可以假設每種錢幣的數量是無限的。現在有一筆交易,需要找個客戶m元,請你設計乙個演算法,使得找給顧客的錢幣張數最少。

/*找錢問題*/

data _null_;

p=100000;

m=16;

if 0

題2:0_1 揹包問題--給定n 件物品和乙個揹包,物品的重量為weight,其價值為value,揹包的容量為w,求從這n 件物品中選取一部分

物品且對每件物品,要麼選,要麼不選,要求滿足被放入揹包的物品重量不超過揹包的容量。該例資料**《基於貪心演算法的0-1 揹包問題》一文。

/*揹包問題*/

data beibao;

input id weight value;/*物品重量,價值*/

m_value=value/weight;/*平均價值*/

flag=1;/*標示變數*/

w=90;/*揹包容量*/

cards;

1 10 50

2 30 45

3 40 60

4 20 20

5 10 30

6 20 40

;run;

proc sort data=beibao out=beibao1;/*按照單位價值排序*/

by descending m_value;

run;

data new;

set beibao1(rename=(weight=temp ));

by flag;

if first.flag then do;

weight=0;

end;

weight+temp;

if weight>w then delete;

run;

對上述揹包問題稍作修改,如果允許物品分割裝入揹包,那麼揹包能夠裝的物品的最大價值是多少?

這樣揹包最多裝入w重量的物品,對上**稍作修改:total_value即為所求

data new(keep=id w m_value weight value);

set beibao1(rename=(weight=temp1 value=temp2 ));

by flag;

if first.flag then do;

weight=0;value=0;

end;

weight+temp1;value+temp2;

run;

data need;

merge new new(firstobs=2 keep=weight m_value rename=(weight=nextweight m_value=next_mvalue)) ;

if weightw then do;

total_value=value+(w-weight)*next_mvalue;

end;

run;

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

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

演算法 貪心演算法

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

演算法 貪心演算法

集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...