您的位置:首页 > 其它

POJ2229--Sumsets

2015-08-24 21:30 405 查看
题目大意:把一个整数分解为2的幂的和共有几种方案

 

分析:以6和7为例,

6 = 1+1+1+1+1+1

6 = 1+1+1+1+2

6 = 1+1+2+2

6 = 1+1+4

6 = 2+2+2

6 = 2+4

 

7 = 1+1+1+1+1+1+1

7 = 1+1+1+1+1+2

7 = 1+1+1+2+2

7 = 1+1+1+4

7 = 1+2+2+2

7 = 1+ 2+4

如果i为奇数的话,表达式里肯定有1,相当于dp[i-1]的所有情况加1,所以dp[i] = dp[i-1]

如果i为偶数的话,表达式是里若有1,则至少有两个1,那么dp[i-2]的所有情况加两个1,就是dp[i]有1的情况。若没有1,则把表达式的项都除以2即可,也就是dp[i/2]了。所以,dp[i] = dp[i-2]+dp[i/2]。

最后别忘了对10^9取模

代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn = 1000000 + 10;

int dp[maxn];

int main() {
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= 1000000; i++) {
if(i%2) dp[i] = dp[i-1];
else dp[i] = dp[i-2] + dp[i/2];
dp[i] = dp[i]%1000000000;
}
int n;
scanf("%d", &n);
printf("%d\n", dp
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: