贪心算法解决找零钱问题

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;
}
    原文作者:贪心算法
    原文地址: https://blog.csdn.net/weixin_37818081/article/details/78195056
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞