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

【动态规划技巧题】POJ2229-Sumsets

时间:2015-08-17 13:58:59      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

【题目大意】

把一个数n分成2的指数幂相加的形式,问有几种情况。

【思路】

如果当前i为奇数,则必定有至少一个1,可以看作i-1的情形再加上一个1。即f[i]=f[i-1]。

如果当前i为偶数,假设没有1,则所有数字都可以除以2,相当于f[i/2];如果有1,必定有至少两个1,则等于f[i-2]。即f[i]=f[i/2]+f[i-2]。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int MAXN=1000000+50;
 6 int n,f[MAXN];
 7 
 8 int main()
 9 {
10     scanf("%d",&n);
11     f[0]=1;
12     for (int i=1;i<=n;i++)
13     {
14         if (i%2==1) f[i]=f[i-1] % 1000000000;
15             else f[i]=(f[i-2]+f[i/2]) % 1000000000;
16     }
17     cout<<f[n]<<endl;
18     return 0;
19 }

【动态规划技巧题】POJ2229-Sumsets

标签:

原文地址:http://www.cnblogs.com/iiyiyi/p/4736357.html

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