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 }