Skip to content

02229: Sumsets

http://cs101.openjudge.cn/practice/02229/

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

输入

A single line with a single integer, N.

输出

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

样例输入

7

样例输出

6

来源

USACO 2005 January Silver

python
# 按照整数划分来做
'''
递推式:
如果i为奇数:那么它一定可以由f[i-1]转移过来,是前面的那个数所有方案里都加了一个1

如果i为偶数:它可以看成是f[i-2]中的方案加了一个2,或者是f[i/2]的方案里乘了一个2;
所以应该是f[i-2]和f[i/2]的和

'''
MOD = 10**9
N = int(input())
dp = [1] + [0]*N
for i in range(1, N+1):
    if i & 1:
        dp[i] = dp[i-1]
    else:
        dp[i] = (dp[i-2] + dp[i//2]) % MOD # 

print(dp[-1])
python
# 完全背包来做,还要保证幂次方有序

import math

N = int(input())
ln = int(math.log2(N))
dp = [1] + [0]*N
MOD = 10**9
items = []
for i in range(ln+1):
    items.append(pow(2, i))
    
for i in items:
    for j in range(i, N+1):
        dp[j] = (dp[j] + dp[j-i]) % MOD

print(dp[-1])