硬币问题
问题描述:
有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枚)
思路:为了尽量地减少硬币的数量,我们首先得尽可能多地使用500元硬币,剩余部分尽可能多地使用100元硬币,剩余部分尽可能多地使用50元硬币,剩余部分尽可能多地使用10元硬币,再剩余部分尽可能多地使用5元硬币,最后的部分使用1元硬币支付。
也就是优先使用大面值的硬币。使用贪心算法
主要代码部分:
const int V[6] = {1,5,10,50,100,500}
//输入
int C[6];
int A;
void solve(){
int ans = 0;
//对5个面值的硬币一一进行判定
for(int i = 5; i>= 0;i--)
{
//取最小值:接下来最大面值硬币数量和钱数与该面值的比值,哪个小就把值赋给t,这个值就是当前面值的硬币应该取的数量,然后一一加起来得到最终的数量
int t = min(A/V[i],C[i]);
A -= t * V[i];
ans += t;
}
printf("%d\n",ans);
}