POJ2229 Sumsets

来源:互联网 发布:网络综艺节目评价 编辑:程序博客网 时间:2024/05/18 11:23

题目描述

给定一个数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;}


0 0
原创粉丝点击