关于贪心算法的概念、原理这里不想多提,可见百度http://baike.baidu.com/view/298415.htm 。因为是刚刚接触,所以并没什么特别的理解,但因为对C,C++等语言并不了解,这里姑且试着用SAS做两道题。
题1:
100元,50元,20元,10元,5元,2元,1元。你可以假设每种钱币的数量是无限的。现在有一笔交易,需要找个客户m元,请你设计一个算法,使得找给顾客的钱币张数最少。
/*找钱问题*/
data _null_;
p=100000;
m=16;
if 0<m<=p then do;
a=floor(m/100);
b=floor((m-100*a)/50);
c=floor((m-100*a-50*b)/20);
d=floor((m-100*a-50*b-20*c)/10);
e=floor((m-100*a-50*b-20*c-10*d)/5);
f=floor((m-100*a-50*b-20*c-10*d-5*e)/2);
g=(m-100*a-50*b-20*c-10*d-5*e-2*f);
num=sum(of a b c d e f g);
output;
end;
put m a b c d e f g num;/*a,...,g是每种钱币对应数量,num是钱币总数*/
run;
题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 weight<w & nextweight>w then do;
total_value=value+(w-weight)*next_mvalue;
end;
run;