一个整数总可以拆分为2的幂的和,求不同拆分的种数。

一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 总共有六种不同的拆分方式。 再比如:4可以拆分成:4=4,4=1+1+1+1,4=2+2,4=1+1+2。 用f(n)表示n的不同拆分的种数,例如f(7)=6。


分析:
f(1)    (1)
f(2)   (11)(2)
f(3)   (111)(12)
f(4)   (1111)(112)(22)(4)
f(5)   (11111)(122)(14)(1112)
f(6)   (111111)(11112)(114)(1122)(222)(24)

当n为奇数时,每个划分必然包含1,所以每一项减1得到f(n - 1), 故f(n) = f(n - 1)。当n为偶数时,可以将所有划分归为两类(A类和B类),A类包含1,B类不含1.A类中每个划分减去1得到f(n - 1), B类中肯定都是偶数,每个划分除以2,得到f(n / 2).故f(n) = f(n - 1) + f(n / 2),综上得到状态方程。


代码:

def f(n):
    if n == 1:
        return 1
    if n == 2:
        return 2
    else:
        if n % 2 != 0:
            return f(n - 1)
        else:
            return f(n - 1) + f(n // 2)


while True:
    num = int(input())
    print(f(num))

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值