贪心算法解决找零钱问题

来源:互联网 发布:苏小红c语言第三版pdf 编辑:程序博客网 时间:2024/05/29 06:55

4.1 找零问题
问题描述:
设有50、20、10、5、1、0.5、0.1等面额的零钱,顾 客购物花了n元,在支付(n / 100 + 1) * 100元后,收银员应如何找 零,才能使找回的钱数最少。
输入: n,表示顾客所花的钱数,最多包含一位小数。
输出: 找回的零钱数。
样例输入: 67.5 243
样例输出: 5 4

//ACM贪心算法应用——找零问题#include <iostream>using namespace std;double MONEY_UNIT[7] = {50, 20, 10, 5, 1, 0.5, 0.1};    //钱的所有面额int main(){    double consumeMoney = 0;                            //消费的金额    cin >> consumeMoney;    double realGiveMoney = 0;                           //实际给的钱    realGiveMoney = (int)(consumeMoney / 100 + 1) * 100;//通过int的自动舍去小数位来计算实际给的钱数    double shouldRevMoney = 0;                          //应该找回的零钱    shouldRevMoney = realGiveMoney - consumeMoney;    //贪心算法实现——局部最优解    int revMoneyAmount = 0;    for (int i = 0; i < 7; i ++) {        if (MONEY_UNIT[i] <= shouldRevMoney) {            shouldRevMoney -= MONEY_UNIT[i];            i--;                                        //继续测试此面额的money是否满足            revMoneyAmount++;                           //找回零钱张数加1        }        if (!shouldRevMoney) {            break;        }    }    cout << "找回的零钱最少张数为 :";    cout << revMoneyAmount << endl;    system("pause");    return 0;}
原创粉丝点击