您的位置:首页 > 其它

poj 2229

2016-01-05 17:02 281 查看
Sumsets

Time Limit: 2000MSMemory Limit: 200000K
Total Submissions: 15105Accepted: 6017
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

有两种做法

第一种是比较暴力的完全背包:

    设状态dp[i]为在总和为i的情况下符合题意的方法总数,因为n不超过2 ^ 20,所以可以把这20个数看成是物品,则可以用完全背包的方法写出状态方程

      dp[i] = dp[i - (1 << j)] ; ((1 << j) <= n)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

const int maxn = 1e6 + 7;
const int mod = 1e9;
int dp[maxn];
int main() {
int n;
scanf("%d", &n);
dp[0] = 1;
for (int i = 1; i <= n; ++i) {
if (i % 2 == 1) {
dp[i] = dp[i - 1];
} else {
dp[i] = (dp[i - 2] + dp[i / 2]) % mod;
}
}

printf("%d\n", dp
);

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: