coins HDU - 3348

思路:

最多能使用多少硬币不好求,就转化成最少使用多少个硬币的问题。首先,尽可能地使用面值最大的硬币,由于已经将硬币面值按从小到大的顺序存进数组,所以只需从数组尾部遍历穷举,p/b[i]求出需要用掉所剩硬币中面值最大的那种硬币多少个,再取p/b[i]与a[i](该面值的硬币还有多少枚)中的较小值m,(若把该面值的硬币全部花完,p/b[i]==a[i]),然后统计总共花了多少枚硬币的变量cnt+=m,还需要付的钱数变量p-=b[i]*m,当p=0时,可以找到一种方案,否则不存在硬币数目花费最少的方案,也就不存在硬币数目花费最多的方案。解决了求花最少枚硬币的问题,就可以解决花最多枚硬币的问题,首先求出总共持有多少枚硬币coin,以及总面额total,要求如何使p花费最多枚硬币,则可以转化成如何使total-p花费最少枚硬币的问题,将coin减去total-p花费的硬币数就可以求出p最多能花费多少枚硬币。

C++代码:

#include <iostream>
#include<cmath>
#include <algorithm>
using namespace std;
int b[]={1,5,10,50,100};
int atleast(int p,int a[])
{
    int cnt=0,m;
    for(int i=4; i>=0; i--)
    {
        m=min(p/b[i],a[i]);
        p-=b[i]*m;
        cnt+=m;
    }
    if(p==0)
        return cnt;
    else
        return -1;
}
int main()
{
    int a[5];
    int p,n,total,coin;
    cin>>n;
    while(n--)
    {
        cin>>p;
        total=0,coin=0;
        for(int i=0; i<5; i++)
        {
            cin>>a[i];
            total+=a[i]*b[i];
            coin+=a[i];
        }
        if(atleast(p,a)==-1)
        {
            cout<<-1<<" "<<-1<<endl;
        }
        else
            cout <<atleast(p,a)<<" "<<coin-atleast(total-p,a)<< endl;
    }
    return 0;
}
发布了35 篇原创文章 · 获赞 2 · 访问量 1399

猜你喜欢

转载自blog.csdn.net/weixin_41001497/article/details/88668166
今日推荐