一个整数总可以拆分为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))