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;
}