POJ2229 Sumsets

题目描述

给定一个数N (1 <= N <= 1,000,000),将其分解为若干个2的幂次方数。问其有几种分解方式。


样例

输入

7

输出

6


样例解释

7=1+1+1+1+1+1+1

7=1+1+1+1+1+2

7=1+1+1+2+2

7=1+1+1+4

7=1+2+2+2

7=1+2+4


解题思路

仔细分析以后不难发现,如果n是奇数(不是1),那么它其实和n-1的情况个数是一样的(无非是在每种情况最后加了一个1)。所以我们只需要分析所有偶数个的情况就可以了。我们可以把某个偶数 分成两种情况讨论:

A.分解式中有1出现。不难看出,这时必须有2个1一直放在那里不动。那么这种情况的数量不就和n-2的情况的数量相等吗?(仔细想)

B.分解式中没有1出现。这时所有分解数都是偶数。那么把他们都除以2好了!你会发现…………居然就成了n/2的情况!!

到这里就显然了……递推。 详见代码。


#include <cstdio>
const int maxn = 1000010;
int ans[maxn];
int main()
{
    ans[1] = 1;
    ans[2] = 2;
    for(int i = 3 ; i < maxn ; i ++){
        if(i%2){//奇数
            ans[i] = ans[i-1];
        }else{//偶数
            ans[i] = ans[i-2] + ans[i/2];
        }
    }
    int n;
    scanf("%d",&n);
    printf("%d\n",ans[n]);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值