【DP】poj2229_Sumsets_201408041139

Sumsets
Time Limit: 2000MS Memory Limit: 200000K
Total 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

 
 
题意:把一个整数划分成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 1000000000

int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值