poj 2229 拆数问题 dp算法

题意:一个n可以拆成 2的幂的和有多少种

思路:先看实例

1   1

2    1+1     2

3     1+1+1  1+2

4      1+1+1+1  1+1+2  2+2  4

5     1+1+1+1+1  1+ 1+1+2  1+2+2  1+4

  1. 对于奇数:相当于前面一个偶数的每一种情况的开头+1 dp[i]=dp[i-1]
  2. 对于偶数   分两种情况 开头是1的  相当于 dp[i-1]   开头没有1的 相当于 dp[i/2]的情况

解决问题的代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int dp[10000000];
int main()
{
        int n;
        dp[1] = 1;
        scanf("%d", &n);
        for (int i = 2; i <= n; i++)
        {
               if (i % 2 == 1) dp[i] = dp[i - 1];
               else dp[i] = (dp[i - 1] + dp[i / 2])% 1000000000;
        }
        printf("%d\n", dp[n]);
        return 0;
}

 

posted @ 2018-08-02 13:35  徐小晋  阅读(106)  评论(0编辑  收藏  举报