巧妙思维:2的幂数

小明开始学习二进制转化到十进制,其中要用到2的幂(2的3次幂就是3个2相乘),他觉得这个很有意思。既然通过2的幂相加可以得到十位数,那么反过来,一个十进制数是否可以通过若干个2的幂相加得到呢?

小明开始研究起来,他先列出了所有2的幂:1,2,4,8,16,32,64……。

4=1+1+1+1

4=1+1+2

4=2+2

4=4

4共有4种方法

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

扫描二维码关注公众号,回复: 6562611 查看本文章

7=1+2+2+2

7=1+2+4

7共有6种方法

1+2+4和2+1+4认为是同一个等式,因为它们的组成相同。

现在小明想要知道,给出一个十进制数(不超过10000),可以写出多少种,用若干个2的幂数相加的式子。

思路:

1.如果n是奇数,则f[n]=f[n-1](一定要分个1出来,所以它的结果就等于偶数n-1的结果)

2.如果n是偶数,则考虑将它拆分为带1和不带1两种情况:

(1)带1:这种情况下种数为f[n-1](也就是奇数n-1的结果)

(2)不带1:这种情况下种数为f[n/2](很巧妙,分出来不带1的情况下肯定分出来的数每个都是偶数,这种情况下的种数可以等价于n/2的种数,因为把分出来的数都除以2不就是n/2分出来的数吗?)

综上:有递推公式:n为奇时,f[n]=f[n-1];n为偶时,f[n]=f[n-1]+f[n/2];

此外,还要注意n==1时,直接初始化f[1]=1。

#include <cstdio>
int f[1010];

int main(){
    int n;
    scanf("%d", &n);
    f[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(i % 2 != 0) f[i] = f[i - 1];
        else f[i] = f[i-1] + f[i/2];
    }
    printf("%d\n",f[n]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/baoyihan/p/11067629.html
今日推荐