Sumsets
Time Limit: 2000MS | Memory Limit: 200000K | |
Total Submissions: 26408 | Accepted: 9992 |
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
刚学dp有点懵懵懂懂的,这个题是完全背包
递推式是: dp[j] = dp[j] + dp[j-c[i]] 0<=i<n (n是可能会出现的2的指数序列的个数) 初始dp[0]=1
#include <stdio.h> #include <stdlib.h> #include <string.h> int max(int a, int b) { return a>b ? a:b; } int dp[1000100]; int main() { int c[20]; c[0]=1; for(int i=1; i<20; i++) c[i] = c[i-1]*2; int n; while(scanf("%d", &n)!=-1) { dp[0]=1; for(int i=0; i<20; i++) { for(int j=c[i]; j<=n; j++) { dp[j] = (dp[j] + dp[j-c[i]])%1000000000; } } printf("%d ", dp[n]); } }