贪心算法(greedy algorithm)

来源:互联网 发布:三阶矩阵的逆矩阵公式 编辑:程序博客网 时间:2024/06/05 19:04

关于贪心算法的概念、原理这里不想多提,可见百度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 502 30 453 40 604 20 205 10 306 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;


 


 

 

原创粉丝点击