【DP】poj2229_Sumsets_201408041139

来源:互联网 发布:电视如何解除网络禁用 编辑:程序博客网 时间:2024/05/29 09:29
Sumsets
Time Limit: 2000MS Memory Limit: 200000KTotal Submissions: 12692 Accepted: 5091

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

USACO 2005 January Silver
 
 
题意:把一个整数划分成2的次幂相加的方案数(类似于整数划分)
 
解题思路:
 
可以把n分成奇数和偶数来分别对待:因为2^0=1,2^1=2,2^2=4......
1、n为奇数:n的划分中肯定都要含1,所以 num[n] = num [n-1]; 即把n-1的划分方案每个加1
2、n为偶数:可以分成两种情况来考虑:一、划分方案中含有1(那么1的个数肯定为偶数),(这时n-1为奇数,n-1的划分中都含1),所以划分方案=num[n-1];
                                                                         二、划分方案中不含1,那么划分中肯定都是2的倍数,(因为只有2︿0=1),所以划分方案=num[n/2];
  即n为偶数时 num[n] = num[n-1] + num[n/2] ;
 
附AC代码:
#include <stdio.h>#include <string.h>#include <stdlib.h>#define mod 1000000000int f(int n){    int i,j,k,*s;    s = (int *)malloc((n+1)*sizeof(int));    memset(s,0,4*(n+1));        s[1]=1;    for(i=2;i<=n;i++)    {        if(i&1)        s[i]=s[i-1]%mod;        else        {            s[i]=(s[i-1]+s[i/2])%mod;        }    }    return s[n]%mod;}int main(){    int n;    scanf("%d",&n);          printf("%d\n",f(n));    //system("pause");    return 0;} 

体会:
没好好看题,第一眼看到划分序列,立马想到整数划分,然后按照那个思路写,然后也没写对
这道题运用dp的思想,然后根据题意,抓住2的次幂,很巧妙地解法
 
标签:DP
0 0