POJ 2229(Sumsets)

Posted jaszzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2229(Sumsets)相关的知识,希望对你有一定的参考价值。

题目链接:http://poj.org/problem?id=2229

 

思路:“动态规划”问题

   只需要列三个连续数字N即可发现:1.N为奇数时,f(n)=f(n-1)

                     2.N为偶数时,f(n)=f(n-1)+f(n/2)

                     因为此时N-1为基数,N-1情况的每一行第一个数一定是1,所以加上一个1时,就相当于在前面直接加一个1或者与 “后面” 的1组成2。

 

ac代码:

技术图片
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <string.h>
#define MOD 1000000000
int N;
int dp[1000005];

int main(void){    
    int num=1;
    scanf("%d",&N);
    dp[1]=1;
    for(int i=2;i<=N;i++){
        if(i&1==1){
            dp[i]=dp[i-1];
        }else{
            dp[i]=(dp[i-1]+dp[i>>1])%MOD;
            // 此处一定要取模
        }
    }
    printf("%d
",dp[N]);

    return 0;
}
View Code

有一个小技巧:

按位操作

以上是关于POJ 2229(Sumsets)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2229 Sumsets(规律)

POJ 2229(Sumsets)

POJ 2229 Sumsets(简单DP)

POJ 2229 Sumsets

poj 2229 Sumsets 完全背包求方案总数

poj2229 Sumsets