poj2229(Sumsets)

Description

Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows use only numbers that are an integer power of 2. Here are the possible sets of numbers that sum to 7: 

1) 1+1+1+1+1+1+1 
2) 1+1+1+1+1+2 
3) 1+1+1+2+2 
4) 1+1+1+4 
5) 1+2+2+2 
6) 1+2+4 

Help FJ count all possible representations for a given integer N (1 <= N <= 1,000,000). 

Input

A single line with a single integer, N.

Output

The number of ways to represent N as the indicated sum. Due to the potential huge size of this number, print only last 9 digits (in base 10 representation).

Sample Input

7

Sample Output

6

设dp[n]表示n的拆分数,若n是奇数,必能拆分出一个1,所以dp[n]=dp[n-1];若n是偶数,则n/2的所有拆分方法每个数乘以2后就是n的拆分方法,n还可以拆成1+1+(n-2),所以dp[n]=dp[n/2]+dp[n-2]

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <limits>
#include <new>
#include <utility>
#include <iterator>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <ctime>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double EPS = 1e-8;
const int MAXN = 1000010;
int dx[] = {0, 1, 0, -1}, dy[] = {-1, 0, 1, 0};

int dp[MAXN] = {0, 1, 2};

int main()
{
    for (int i = 3; i < MAXN; ++i)
        dp[i] = (i&1) ? dp[i-1] : (dp[i/2] + dp[i-2]) % 1000000000;
    int n;
    cin >> n;
    cout << dp[n] << endl;
    return 0;
}


原文地址:https://www.cnblogs.com/godweiyang/p/12203980.html