昨天太着急 没注意数据的范围直接用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; }