钱币找零问题(贪心算法)(动态规划)

钱币找零问题
这个问题在我们的日常生活中就更加普遍了。假设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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值