🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
所属专题:[组合数学](README.md);[动态规划](README.md) &emsp; ## 问题 在著名的“斐波那契兔子”问题中,有如下的假定: 1. 兔子种群在第一个月从一对新生的兔子开始; 2. 兔子们在出生一个月后达到生育年龄; 3. 在任何一个月,每一只育龄兔子会与另一只育龄兔子交配; 4. 兔子交配后一个月,会生下一对兔子(一只雄兔与一只雌兔); 5. 不考虑兔子寿命限制,兔子会一直繁殖下去。 在这里,我们对“斐波那契兔子”问题进行推广,每对兔子交配后一个月,将产下`$ k $`对兔子,求解若干个月后的兔子总对数。 **输入:** 两个正整数`$ n\le40 $`与`$ k\le5 $`。 **输出:** 第`$ n $`个月时兔子的总对数。假定我们从1对兔子开始,在每一代,一对兔子会生下`$ k $`对兔子(而不是原始“斐波那契兔子”问题中的1对)。 **样例数据:** ``` 5 3 ``` **样例输出:** ``` 19 ``` &emsp; ## 背景知识 这个问题来源于历史上著名的数学问题“斐波那契兔子”问题。在原问题的设定中,兔子数量随时间(代际)发展的变化如下图所示:(图片来源:[ROSALIND](http://rosalind.info/media/problems/fib/)) ***** <div align="center"><img src="http://rosalind.info/media/problems/fib/rabbit_tree.thumb.png"></div> <div align="center">斐波那契兔子数量在前六个月的增长图示</div> ***** 斐波那契兔子问题还涉及递推数列等数学问题。详情请查阅ROSALIND网站上[关于该问题的背景说明](http://rosalind.info/problems/fib/)。 &emsp; ## 解答 ``` def fib_new(n, k): """给定兔子代数n与单次繁殖数k,遵循斐波那契规则,计算n代兔子的总数""" num = [0, 1, 1] for i in range(3, n+1): num.append(k*num[i-2]+num[i-1]) return num[n] ## --main-- with open("rosalind_fib.txt", 'r') as f1: n,k = map(int, f1.read().split()) with open("rosalind_fib_out.txt", 'w') as f2: f2.write(str(fib_new(n, k))) ```