码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-04-01 13:09:05      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:src   等于   bsp   image   name   arm   loading   inf   HERE   

地址 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;
}

 

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

标签:src   等于   bsp   image   name   arm   loading   inf   HERE   

原文地址:https://www.cnblogs.com/itdef/p/14602376.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!