POJ 2229 DP

题意:给你个数,让你把它拆成2的幂的和,问有几种拆分方案。
思路:仔细想一想,就是个递推。

  1. 如果是奇数,那么它的方案数和它减一这个数的方案数是一样的。因为1不能拆成除1以外的2的幂之和。(呃说的不太清楚,意会意会(⊙﹏⊙)b)。【举个例子:100的方案数 和101的方案数是一样的】
  2. 如果是偶数,那么它的方案数等于它减一这个数的方案数与它除以二这个数的方案数之和。【举个例子:6的方案数=3的方案数+5的方案数】

也可以先手算几个数找找规律,用不完全归纳。

// by Sirius_Ren
#include <cstdio>
using namespace std;
int f[1000001],n;
int main(){
    scanf("%d",&n);
    f[1]=1;f[2]=2;
    for(int i=3;i<=n;i++)
        if(i&1)f[i]=f[i-1];
        else f[i]=(f[i-1]+f[i/2])%1000000000;
    printf("%d",f[n]);
}

代码很短,只有10行。
这里写图片描述

posted @ 2016-05-15 19:52  SiriusRen  阅读(123)  评论(0编辑  收藏  举报