POJ 2229 Sumsets(经典2次幂和问题)

题意:

求把一个整数n分解为2的幂的和共有几种方案

思路:

1. n为奇数,则肯定其中有1的组成,所以dp[n] = dp[n-1]

2. n为偶数,根据1的存在划分为2种情况:

   a, 有1的组成,则肯定有2个1,dp[n]的一部分是dp[n-2]

   b, 没有1的组成,这时候如果把组成的每个数都除以2,则dp[n]的另一部分就变成dp[n/2]

#include <cstdio>
#include <cstdlib>
#include <cstring>

const int M = 1000000000;
const int MAXN = 1000010;

int dp[MAXN];

int main()
{
    int n;
    scanf("%d", &n);
    dp[0] = dp[1] = 1;

    for (int i = 2; i <= n; ++i)
        if (i & 0x01)
            dp[i] = dp[i-1];
        else
            dp[i] = (dp[i-2] + dp[i>>1]) % M;

    printf("%d\n", dp[n]);
    return 0;
}

 

posted @ 2012-12-05 20:57  kedebug  阅读(841)  评论(2编辑  收藏  举报