码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1028

时间:2015-10-11 21:18:10      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

题目:

  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 }
View Code

HDU 1028

标签:

原文地址:http://www.cnblogs.com/Aony-nbut/p/4869859.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!