POJ-2229

Posted Kiven#5197

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-2229相关的知识,希望对你有一定的参考价值。

Sumsets
Time Limit: 2000MS   Memory Limit: 200000K
Total Submissions: 19599   Accepted: 7651

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

 

题意:
给出一个整数n,求n有多少种由2的幂次之和组成的方案. 

 

当n为奇数的时候,那么所求的和式中必有1,则dp[n]==dp[n-1];

当n为偶数的时候,可以分两种情况:

1.含有1,个数==dp[n-1];

2.不含有1,这时每个分解因子都是偶数,将所有分解因子都除以二,所得的结果刚好是n/2的分解结果,并且一一对应,则个数为dp[n/2];

 

 

AC代码:

 1 //#include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 const long long MOD=1000000000;
 7 
 8 int dp[1000010];
 9 
10 int main(){
11     ios::sync_with_stdio(false);
12     int n;
13     while(cin>>n&&n){
14         memset(dp,0,sizeof(dp));
15         dp[1]=1;
16         for(int i=2;i<=n;i++){
17             if(i&1){
18                 dp[i]=dp[i-1];
19             }
20             else{
21                 dp[i]=(dp[i-1]+dp[i>>1])%MOD;
22             }
23         }
24         cout<<dp[n]<<endl;
25     }
26     return 0;
27 }

 

以上是关于POJ-2229的主要内容,如果未能解决你的问题,请参考以下文章

poj 2229 完全背包dp递推dp

POJ 2229(Sumsets)

POJ 2229 Sumsets

poj--2229

POJ 2229 递推

POJ-2229