硬币问题

题目: 

 


输入

C,=3,C。=2,C。=1,C。=3,C0=0,Cs0=2,A= 620

输出

6 (500元硬币1枚,50元硬币2枚,10元硬币1枚,5元硬币2枚,合计6枚)


分析:

这是个贴近生活的简单问题。凭直觉,可以得出如下正确的解答。

■首先尽可能多地使用500元硬币;

■剩余部分尽可能多地使用100元硬币;

■剩余部分尽可能多地使用50元硬币;

■剩余部分尽可能多地使用10元硬币;

■剩余部分尽可能多地使用5元硬币;

■最后的剩余部分使用1元硬币支付。

或者,简而言之,

■优先使用面值大的硬币。

该算法可以说是贪心算法中最简单的例子。上节的搜索算法和下节的动态规划算法是在多种策略中选取最优解,而贪心算法则不同,它遵循某种规则,不断地选取当前最优策略。例如在此题中,“优先使用面值大的硬币”就是在计算过程中所遵循的规则。并且,我们只考虑“尽可能多的使用面值大的硬币”这一-种当前最优策略。

如果问题能够用贪心算法来求解的话,那么它通常是非常高效的。如果把这里的硬币问题当作-种背包问题,那么比起用动态规划算法求解,贪心算法更简单高效。

代码实现:

#include<iostream>
#include<vector>
using namespace std;
vector<int>C(6,0);//张数
vector<int>D= {1,5,10,50,100,500};//面值
int A;
void solve() {
	int sum=0;
	for(int i=5; i>-1; --i) {
		int t=min(A/D[i],C[i]);//每种面值最多能用多少张
		A-=t*D[i];
		sum+=t;
		if(!A)
			break;
	}
	cout<<sum;
}
int main() {
	for(int i=0; i<6; ++i)
		cin>>C[i];
	cin>>A;
	solve();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大章鱼(张文哲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值