学习日志

硬币问题(贪心算法)

刷题记录22
问题描述:
有1元、5元、10元、50元、100元、500元的硬币各C1,C5,C10,C50,C100,C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?假设本题至少存在一种支付方案。
限制条件:
0<=C1,C5,C10,C50,C100,C500<=10的9次方
0<= A <= 10的9次方
输入:
C1 = 3
C2 = 2
C10 = 1
C50 = 3
C100 = 0
C500 = 2
A = 620
输出:
6(500元硬币1枚,50元硬币2枚,10元硬币1枚,5元硬币2枚,合计6枚)
代码

#include<iostream>
using namespace std;
const  int V[6] = { 1,5,10,50,100,500 };//定义硬币的面额
int main()
{
	int C[6];//定义一个数组存放每种面额硬币的数量
	int A;//总共支付A元
	int ans = 0;//统计硬币数量
	int i;
	for (i = 0; i <= 5; i++)
	{
		cin >> C[i];
	}
	cin >> A;
	for ( i = 5; i >= 0; i--)
	{
		int t = min(A / V[i], C[i]);//A/V[i]的意思是可换的数量,C[i]的意思是这种面额的硬币有的数量。
			A -= t * V[i];//总额减去第i钟面额可换的额度
		ans += t;//硬币总量
	}
	cout << ans << endl;
	return 0;
}
	

解题思路
首先尽可能使用多的大额硬币,500用完再用100,以此类推。最关键的一步就是: t=min(A/V[i],C[i]) 这一步的意思是让t等于某种面额可换的硬币数量,
然后再用t去乘以这种面额,用A减掉它,不断重复这个步骤直到支付总额被兑换完成。
贪心算法:
贪心算法就是遵循某种规则,不断贪心地选取当前最优策略的算法设计方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值