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).
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