(HDU)1028 --Ignatius and the Princess III(Ignatius和公主III)
问题描述
“好吧,第一个问题似乎太容易了,我会让你知道你后来有多愚蠢。 feng5166说。
“第二个问题是,给定一个正整数N,我们定义一个这样的方程:
N = a [1] + a [2] + a [3] + ... + a [m];
a [i]> 0,1 <= m <= N;
我的问题是,你可以找到一个给定的N有多少不同的方程。
例如,假设N是4,我们可以找到:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
因此当N为4时结果为5.注意,在该问题中“4 = 3 + 1”和“4 = 1 + 3”是相同的。 现在,你做!
输入
输入包含几个测试用例。 每个测试用例包含上面提到的正整数N(1≤N≤120)。 输入由文件结尾终止。
输出
对于每个测试用例,您必须输出一个包含整数P的行,表示您发现的不同等式。
样例输入
4
10
20
样例输出
5
42
627
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 const int MAXN=130; 4 int dp[MAXN][MAXN]; 5 //dp[i][j]表示 i 表示成最大的数不超过 j 的方法数 6 int calc(int n,int m) 7 { 8 9 if(dp[n][m]!=-1) return dp[n][m]; 10 11 12 if(n<1||m<1) return dp[n][m]=0; 13 if(n==1||m==1) return dp[n][m]=1; 14 if(n<m) return dp[n][m]=calc(n,n); 15 if(n==m) return dp[n][m]=calc(n,m-1)+1; 16 return dp[n][m]=calc(n,m-1)+calc(n-m,m); 17 18 } 19 int main() 20 { 21 int n; 22 memset(dp,-1,sizeof(dp)); 23 24 while(scanf("%d",&n)!=EOF) 25 printf("%d\n",calc(n,n)); 26 return 0; 27 }