算法第四节:贪心算法解决“超市找零方案”问题

问题描述:要求编写一个程序实现超市的找零方案,只需要输入要找给顾客的金额,然后通过程序可以计算出该金额可以由哪些面额的人民币组成。

算法分析:人民币有100、50、20、10、5、1、0.5、0.2、0.1等多种面额组成(元),比如找零68.90元,至少有以下三种方案:

  1. 1张50、1张10、一张5、3张1、1张0.5、4张0.1
  2. 2张20、2张10、一张5、3张1、1张0.5、4张0.1
  3. 6张10,、1张5、3张1、1栈更、4张0.1

具体实现代码如下:

#include

#define MAXN 9
int parvalue[MAXN] = {10000,5000,2000,1000,500,100,50,10};//8种面值的货币乘以100
int num[MAXN] = {0};//储存找零各面值的张数

int exchange(int n); //找零函数声明

int main(){
    int i;
    float change;//找零
    printf("请输入需要找零的金额:");
        scanf_s("%f",&change);//输入找零金额
        exchange((int)change*100);//找零乘以100并转化为整型
        printf("找零%.2f元的组成为:\n",change);
        for (i = 0;i//找零面值组成输出
            if (num[i]>0)//如果面值张数大于0,则输出
            printf("%6.2f,%d张\n",(float)parvalue[i]/100.0,num[i]);//面值除以100.0输出
        }
        getchar();
        return 0;
}

int exchange(int n){//找零函数
    int i, j;
    for (i = 0;iif (n>parvalue[i])break;//如果找到比最小面值的货币还小的数
        while (n>0&&i//从最大面值的货币开始比较
            if (n>=parvalue[i]){
                n -= parvalue[i];
                num[i]++;//储存减去的货币面值的数组加1
            }
            else if (n >= 5 && n < 10){//如果找零还剩0.1元至0.05元之间,按0.1元找零
                num[MAXN-1]++;
                break;//结束循环
            }
            else i++;
        }
        return 0;
    }
}

运行结果如下:
算法第四节:贪心算法解决“超市找零方案”问题_第1张图片

你可能感兴趣的:(算法学习入门与应用)