题目链接:

https://vjudge.net/contest/348156#problem/E

题面:

翻译:

假设有5种硬币:50美分、25美分、10美分、5美分和1美分。我们想
用这些硬币兑换一定数量的钱。
例如,如果我们有11美分,那么我们可以用一枚10美分的硬币和一枚1美分的硬币来做改变
硬币,两枚5美分硬币和一枚1美分硬币,一枚5美分硬币和六枚1美分硬币,或十一枚1美分硬币。
所以有四种方法可以用上面的硬币兑换11美分。请注意,我们将其计算在内
有一种方法可以零钱换零钱。
编写一个程序,找出对任意数量的
以美分计的钱。你的程序应该能处理高达7489美分。

输入:
输入文件包含任意数量的行,每一行包含一个金额的数字
以美分计。

输出:
对于每个输入行,输出一行,其中包含使用
五种以上的硬币。

思路:

这道题目思路看https://blog.csdn.net/qq_45740533/article/details/103612924

参考代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    long long t;
    while(scanf("%lld",&t)!=EOF)
    {
        int a[10],i,j;
        int dp[50000];
        memset(dp,0,sizeof(dp));//对dp数组先进行清零
        a[1]=1;
        a[2]=5;
        a[3]=10;
        a[4]=25;
        a[5]=50;//把每种硬币直接存储到一个数组中去
        dp[0]=1;
        for(i=1;i<=5;i++)
        {
            for(j=a[i];j<=t;j++)
            {
                dp[j]=dp[j]+dp[j-a[i]];
            }
        }
        printf("%d\n",dp[t]);
    }
}