硬币问题(贪心算法)
刷题记录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减掉它,不断重复这个步骤直到支付总额被兑换完成。
贪心算法:
贪心算法就是遵循某种规则,不断贪心地选取当前最优策略的算法设计方法。