贪心法的设计思想:贪心法把一个复杂问题的求解过程划分为若干个阶段,每一个阶段都按照某种贪心选择策略进行选择,以迭代的方式秋的每个阶段的当前最优解,每一次迭代都向给定目标前进一步,最终得到原问题的解。贪心法并不是从整体最优考虑,每一个阶段做出的选择都只是某种意义上的局部最优,这种局部最优选择并不总能获得整体最优解,但通常能获得近似最优解。
付款问题:假设有面值为5元、2元、1元、5角、2角、1角的纸币,需要找给顾客4元6角现金,要求找到一个付款方式,使得付出的纸币张数最少。
算法实现:
money和sum都乘10,是为了不进行实数运算,后续再除10。
int PayMoney(double sum){
int money[6] = {50,20,10,5,2,1};//5元,2元,1元,5角,2角,1角
int i,count = 0,n = sum*10;//count为纸币张数,money和sum乘10是为了不进行实数运算
while(n>0){
for(i=0;i<6;i++){
if(n >= money[i]){
count++;
cout<<"面值为"<<(double)money[i]/10<<endl;
n -= money[i];
break;
}
}
}
return count;
}
测试如下:
int main(){
int count = PayMoney(4.6);
cout<<"纸币张数为:"<<count<<endl;
return 0;
}
输出如下:
面值为2
面值为2
面值为0.5
纸币张数为:3