http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=615
1 用dp[i][k]表示以k为最大值组成i需要多少种方法 2 那么答案ans=dp[i][50]+dp[i][25]+dp[i][10]+dp[i][5]+dp[i][1]; 3 用dfs()求dp[i][k]; 4 转移方程: 5 dp[i][k]=0 i<k||i<0 6 dp[i][k]= 求和dfs(i-k,x) 1<=x<=k; 7 8 9 10 #include<stdio.h> 11 #include<string.h> 12 const int maxn=8000; 13 int dp[maxn][6]; 14 int a[6]; 15 int dfs(int x,int k)//求解dp[i][k]; 16 { 17 18 if(x<=0||a[k]>x)return 0; 19 if(x==a[k]||a[k]==1) 20 { 21 dp[x][k]=1; 22 return dp[x][k]; 23 } 24 if(dp[x][k]>=0)return dp[x][k]; 25 int sum=0; 26 int m=x-a[k]; 27 for(int i=k;i<=5;i++)//求和 28 { 29 sum+=dfs(m,i); 30 } 31 dp[x][k]=sum; 32 return dp[x][k]; 33 } 34 int main() 35 { 36 int n; 37 a[1]=50; 38 a[2]=25; 39 a[3]=10; 40 a[4]=5; 41 a[5]=1; 42 43 memset(dp,-1,sizeof(dp)); 44 while(scanf("%d",&n)!=EOF) 45 { 46 if(n==0){printf("1\n");continue;} 47 int ans=dfs(n,1)+dfs(n,2)+dfs(n,3)+dfs(n,4)+dfs(n,5); 48 printf("%d\n",ans); 49 } 50 }
转载于:https://www.cnblogs.com/acSzz/archive/2012/06/23/2559194.html