挑战程序设计竞赛 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   itdef  阅读(78)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示