硬币问题(贪心)


有1元,5元,10元,50元,100元,500元的硬币各A1,A5,A10,A50,A100,A500枚,现在要用这些硬币支付money元,最少需要支付多少硬币?假定本题至少一种支付方案。

分析:

要使数量最少,所以要先从面值大的开始选择,依次往下类推,即可得到最佳答案。

优先选择面值大的。

#include<iostream>

#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<queue>
#define L(i,n,m) for(int i = n;i >= 0;i --)
#define M(i,n,m) for(int i = n;i < m;i ++)
#define N(n,m) memset(n,m,sizeof(n));
const int V[6] = {1,5,10,50,100,500};   ///面值
using namespace std;

int main()
{
    int a[6],money,sum;     ///数组a为所有面值的数量有多少
    while(cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>money)
    {
        sum = 0;
        L(i,5,0)
        {
            int t = min(money/V[i],a[i]);   ///找出使用面值V[i]的数量
            money -= t * V[i];      ///总钱数减少
            sum += t;           ///数量增加
        }
        printf("%d\n",sum);     ///输出
    }
    return 0;
}

你可能感兴趣的:(算法,ACM,贪心)