poj--2229

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

本题借鉴了一片博客,博主写的挺好的
题目大意:给定一个数用2的幂次方数,求可以有多少表达方式。
题解:动态规划和递推,如果i为偶数,dp[i]=dp[i/2]+dp[i-2]
  偶数的时候分有一和没有一进行考虑,
  有一的话就肯定有两个一,那么dp[i]=dp[i-2];
  没有一的话,就是都除以2 dp[i]=dp[i/2];
  i为奇数,肯定有一个一 dp[i]=dp[i-1];
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int M=1000000000;
const int MAXN=1000010;
int dp[MAXN];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        dp[0]=dp[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(i & 0x01)
                dp[i]=dp[i-1];
            else
                dp[i]=(dp[i-2]+dp[i>>1])%M;
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}
 

猜你喜欢

转载自www.cnblogs.com/acmblog/p/9575836.html