昨天太着急 没注意数据的范围直接用dp数组直接用int 了 今天想了一下  应该用long long

#include <cstdio>
#include <cstring>

int coin[5]= {1,5,10,25,50};
long long dp[5][30010];
long long dfs(int cur,int sum)
{
    if(sum==0)
        return  dp[cur][sum]=1;
    if(dp[cur][sum]!=-1)
        return dp[cur][sum];
    dp[cur][sum]=0;
    for(int i=cur; i<5; i++)
    {
        if(sum>=coin[i])
            dp[cur][sum]+=dfs(i,sum-coin[i]);
    }
    return dp[cur][sum];
}
int main()
{
    memset(dp, -1, sizeof(dp));
    int n;
    while(scanf("%d",&n)==1)
    {
        dfs(0,n);
        if(dp[0][n]==1)
        printf("There is only 1 way to produce %d cents change.\n",n);
        else
            printf("There are %lld ways to produce %d cents change.\n",dp[0][n],n);
    }
    return 0;
}
View Code

 

posted on 2013-08-08 16:06  风流monkey  阅读(130)  评论(0编辑  收藏  举报