标签:
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1028
解法:
首先定义f[i][j]为把i拆分为j个数的情况
拆分的时候分成两种情况:
1,每一份都没有1,那么我们只需要将每份都减1,然后保证有j份。即f[i-j][j]。
2,至少有一份是1:那么我们把那一份是1的去掉,即f[i-1][j-1]。
于是方程就是
f[i][j]=f[i-j][j]+f[i-1][j-1]
1028上是要求一个数拆分的所有情况,那么把j从1到n循环一遍,把所有的f[i][j]加起来
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int i, j, k, n, m; 6 long long f[130][130]; 7 while(cin>>n) 8 { 9 m = 0; 10 for(k = 1; k <= n; k++) 11 { 12 f[0][0]=1; 13 for(i=1;i<=n;i++) 14 for(j=1;j<=k;j++) 15 if(i>=j) 16 f[i][j]=f[i-j][j]+f[i-1][j-1]; 17 m += f[n][k]; 18 } 19 cout<<m<<endl; 20 } 21 return 0; 22 }
标签:
原文地址:http://www.cnblogs.com/Aony-nbut/p/4869859.html