Sumsets
Time Limit: 2000ms
Memory Limit: 200000KB
This problem will be judged on PKU. Original ID: 222964-bit integer IO format: %lld Java class name: Main
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
解题:背包。。。类比下就看出来了。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 @author: Lev 3 @date: 4 */ 5 #include <iostream> 6 #include <cstdio> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <cstdlib> 11 #include <algorithm> 12 #include <map> 13 #include <set> 14 #include <queue> 15 #include <climits> 16 #include <deque> 17 #include <sstream> 18 #include <fstream> 19 #include <bitset> 20 #include <iomanip> 21 #define LL long long 22 #define INF 0x3f3f3f3f 23 24 using namespace std; 25 const int maxn = 1000010; 26 int dp[maxn],c[25] = {1}; 27 int main(){ 28 int x; 29 for(int i = 1; i < 25; ++i) 30 c[i] = c[i-1]<<1; 31 while(~scanf("%d",&x)){ 32 memset(dp,0,sizeof(dp)); 33 dp[0] = 1; 34 for(int i = 0;c[i] <= x; ++i){ 35 for(int j = c[i]; j <= x; ++j) 36 dp[j] = (dp[j] + dp[j-c[i]])%1000000000; 37 } 38 printf("%d ",dp[x]); 39 } 40 return 0; 41 }