HZNUOJ 1019 取火柴
题目
有N根火柴,每次只能取1-4根,请问共有几种取法?
举一个例子,假设有3根火柴,取法有4种,分别为1+1+1,1+2,2+1,3。
输入格式
第一行包含一个正整数T(0<T<100),表示进行T次测试。接下来有T行,每行只有一个正整数n(1<=n<=66),代表n根火柴。
输出格式
对于每一个n,输出对应的取法的数量,每次输出占一行。
输入样例
3
1
2
15
输出样例
1
2
10671
思路
首先自然是想到将前四个数字的取法算出,分别计算得到
1根火柴,1种取法
2根火柴,2种取法
3根火柴,4种取法
4根火柴,8种取法
发现前四根是2的n-1次方种
5根火柴时,因无法同时取5根所以会少1种,即少了5自己的组合,想当与少了取一根火柴的时候
6根火柴时,无法同时取5根,6根所以会在5根的基础上少2种即少了5和6的组合,相当于少了取2根火柴的时候
7根火柴时,无法同时取5,6,7三种组合,相当于少了同时取三根火柴的时候
8根,无法同时取5,6,7,8四种的组合,少四根的时候
9根时无法同时取5,6,7,8,9五种的组合,少五根的时候
类推得到,此题为递归算法。
四根火柴以后为后一个为前四个的和。
代码如下
def count(n):
result = [1,2,4,8]
if n>4:
for i in range(n-4):
result.append(result[-4]+result[-3]+result[-2]+result[-1])
return result[-1]
else:
return result[n-1]
t = int(input())
for j in range(t):
n = int(input())
print(count(n))