钱币找零问题(C++)贪心算法

问题描述:

有1元、5元、10元、50元、100元、500元的硬币各C1, C5, C10, C50, C100, C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?若有解,输出最少硬币数;否则输出“-1”(0<=C1, C5, C10, C50, C100, C500<=10^{9},0<=A<=10^{9}) 

程序代码: 

#include   
#include   
using namespace std;
int A;   
int ans=0;     //所需硬币总数  
int ret[6]={0}; //所需每种硬币的数量   
int moneycnt[6];//现有6种硬币的数量   
int moneyval[6]={1,5,10,50,100,500};//每种硬币的面值   
int main()  {  
    int i;  
    int temp;  
    scanf("%d",&A);  
    for(i=0;i<6;i++)  
          scanf("%d",moneycnt[i]);    
    for(i=5;i>=0;i--) {     //贪心策略:优先选择面值大的硬币    
             temp=min(A/moneyval[i],moneycnt[i]); //temp记录使用硬币i的枚数,注意不能超过moneycnt[i]    
             A-=(temp*moneyval[i]);    //剩余支付金额 
             ret[i]+=temp;      //使用硬币i的枚数+temp
             ans+=temp;         //已使用的硬币数+temp     
      }    
    if(A>0) //A>0表示无法用现有硬币支付A元,故输出-1    
         printf("-1\n");      
    else {   //其它情况:可完成支付       
        printf("%d\n",ans);  //最少硬币数     
        for(i=0;i<6;i++)  //每种硬币需要的数量   
            printf("%d 元: %d\n",moneyval[i],ret[i]);  
    }  
    return 0;  
} 

程序分析:

采用的是贪心算法。

该算法的具体实现:

  1. 输入A和每种货币的数目

  2. 从币值从高到低进行贪心策略

  3. 选择所要表示的币值

  4. 记录所选择的币值所要的数目,现金值实时更改

  5. 输出结果

适合贪心算法具有的特征:

  1. 优化问题。

  2. 问题的求解可以划分为若干阶段。

  3. 能够制定出最优量度标准。

  4. 问题具有最优子结构性质。

你可能感兴趣的:(学习,算法,c++)