POJ_2229_Sumsets_(动态规划)

描述


http://poj.org/problem?id=2229

将一个数n分解为2的幂之和共有几种分法?

Sumsets
Time Limit: 2000MS   Memory Limit: 200000K
Total Submissions: 16207   Accepted: 6405

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

Source

分析


对i讨论:

1.i是奇数:

  分成的序列中必有1,所以可将i分为1+(i-1),所以f[i]=f[i-1];

2.i是偶数:
  (1).分成的序列中有1:

    同奇数,f[i]=f[i-1];

  (2).分成的序列中没有1:

    序列中的所有数都是2的倍数,那么任一种序列中的各个数/2,就得到了i/2的序列,那这种情况下,i的序列数就和i/2的序列数相同即f[i]=f[i/2];

  综上:f[i]=f[i-1]+f[i/2];

 1 #include<cstdio>
 2 
 3 const int maxn=1000005,mod=1e9;
 4 int n,f[maxn];
 5 
 6 int main()
 7 {
 8 #ifndef ONLINE_JUDGE
 9     freopen("sum.in","r",stdin);
10     freopen("sum.out","w",stdout);
11 #endif
12     scanf("%d",&n);
13     f[1]=1;
14     for(int i=2;i<=n;i++)
15     {
16         if(i&1) f[i]=f[i-1];
17         else f[i]=(f[i-1]+f[i/2])%mod;
18     }
19     printf("%d
",f[n]);
20 #ifndef ONLINE_JUDGE
21     fclose(stdin);
22     fclose(stdout);
23 #endif
24     return 0;
25 }
View Code
原文地址:https://www.cnblogs.com/Sunnie69/p/5425178.html