钱币找零问题
这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。
//计算最小找零张数 转化为 每次找零都使用已有最大面额的零钱去找零
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 7;
int Count[N] = {3,0,2,1,0,3,5};
int Value[N] = {1,2,5,10,20,50,100};
int solve(int money){ //计算找零最少张数的函数
int num = 0;
for(int i = N - 1;i >= 0;i--)
{
int zhangshu = 0;
if(money > 0){ //money需要找零钱数,只要money不等于零都要进行if下操作
zhangshu = min((money / Value[i]),Count[i]); //零钱的面额从大到小进行遍历,用min函数取总钱数/面额、该面额零钱张数的较小值
num += zhangshu;
}
money -= zhangshu * Value[i]; //(现)钱数 =(原) 钱数 - 已找零钱数(张数*零钱面额)
}
return num;
}
int main()
{
int money;
cin >> money;
int num = solve(money);
cout << "至少要用:" << num << "张" << endl;
return 0;
}