poj2229【完全背包-规律Orz...】

挑战DP
题意:
被组合数只能是2的整数幂,然后给出一个数问有多少种组合(mod1e10);
思路:
完全背包做啊…还是蛮简单的…(这里取膜要改成加法,省时间…)
dp[i]代表对于j的方案数

贴一发吧…

#include <iostream>
#include <cstdio>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const double pi = acos(-1.0);
const int mod = 1e9;
const int N =1e6+10;
int dp[N];
void Init()
{
    memset(dp,0,sizeof(dp));
    dp[0]=dp[1]=1;
    for(int i=1;i<=22;i++)
    {
        for(int j=2;j<=1000000;j++)
        {
            int v=1<<(i-1);
            if(j>=v)
                dp[j]=dp[j-v]+dp[j];
            while(dp[j]>mod)
                dp[j]-=mod;
        }
    }
}
int main()
{
    int n;
    Init();
    while(~scanf("%d",&n))
        printf("%d\n",dp[n]);
    return 0;
}

然后看了discuss的那个blog(我还是很少点这种推送的blog,看完还是蛮搞笑的。。。)

具体也就不讲了…能这样玩也是厉害呀…)一个数乘2的情况和那个数的情况相同,谁说不是呢。弱太菜玩不出…
挫code…………

#include <iostream>
#include <cstdio>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const double pi = acos(-1.0);
const LL mod = 1e9;

const int N =1e6+10;

LL dp[N];

int main()
{
    dp[1]=1;
    for(int i=2;i<=1000000;i++)
    {
        if(i%2==1)
            dp[i]=dp[i-1];
        else
            dp[i]=(dp[i-1]+dp[i/2])%mod;
    }
    int n;
    while(~scanf("%d",&n))
        printf("%d\n",dp[n]);
    return 0;
}
posted @ 2016-08-08 17:42  see_you_later  阅读(147)  评论(0编辑  收藏  举报