挑战程序设计竞赛 2.3章习题 poj 2229 Sumsets dp

地址 https://vjudge.net/problem/POJ-2229

题目大意是输入一个数字 输出以2的幂相加等于它的所有方案,数目较大保留最后九位即可

 

解答

根据图中示例 7有6种组合方式

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

观察规律

如果输入的数是单数N  那么N的组合方式就是N-1的组合方式再额外添加一个1

如果输入的数字是双数N 那么N的组合方式分为两种 出现1 和不出现1 

出现1的组合方式数目就是N-1的组合数目

不出现1的组合方式就是N/2的组合数组(所有组合方式都是N/2的组合元素*2)

 

// 112355551111.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>


using namespace std;


/*
将一个数N分解为2的幂之和共有几种分法?
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).
*/


const int N = 1000010;
int dp[N];
int n;

int main() {
    cin >> n;
    dp[0] = 1; dp[1] = 1; dp[2] = 2;
    for (int i = 3; i <= n; i++) {
        dp[i] = dp[i - 1];
        if ((i & 1 ) == 0) {
            dp[i] += dp[i / 2];
        }
        dp[i] = dp[i] % 1000000000;
    }
    cout << dp[n] % 1000000000 << endl;

    return 0;
}

 

考虑背包的方式

dp[i][j] 表示 2的0~i次方可以选择的情况下  凑齐j的方案数。

那么dp[i][j]= dp[i-1][j](只选择0~2^(i-1)的2次幂)  +  dp[i][j-2^i](多次选择0~2^i的方案数)

 

// Sumsets POJ - 2229.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cmath>
#include <algorithm>
#include <stdio.h>

using namespace std;
//https://vjudge.net/problem/POJ-2229


int dp[21][1000010];
int ans;
int n;

int main()
{
    scanf("%d",&n);
    for (int i = 0; i <= n; i++) {
        dp[0][i] = 1;
    }
    ans = 1;
    for (int i = 1; i <= 20; i++) {
        for (int j = 0; j <= n; j++) {
            dp[i][j] = dp[i - 1][j];
            if (j >=  (1<<i)) {
                dp[i][j] += dp[i][j - (1<<i)];
                dp[i][j] = dp[i][j] % 1000000000;
            }
        }
    }
    printf("%d\n",dp[20][n]);
    return 0;
}

 

 

posted on 2021-03-31 16:57  itdef  阅读(75)  评论(0编辑  收藏  举报

导航