题目描述:https://blog.csdn.net/qq_23934063/article/details/124957375
设:
具备生小孩的兔子总数:a
第一个月的小兔数目: b
第二个月的小兔数目: c
月份 | a | b | c | all |
---|---|---|---|---|
1 | 0 | 1 | 0 | 1 |
2 | 0 | 0 | 1 | 1 |
3 | 1 | 1 | 0 | 2 |
4 | 1 | 1 | 1 | 3 |
5 | 2 | 2 | 1 | 5 |
6 | 3 | 3 | 2 | 8 |
7 | 5 | 5 | 3 | 13 |
… |
迭代到这里,规律也出来了。dp[i] = dp[i-1] + dp[i-2] (i >= 2)
不通过规律,其实这个公式也是可以想出来的,两个月前的兔子到今天都可以生小孩了,所以这个月的兔子总数等于上一个月的兔子+两个月前的兔子生的小孩。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int m;
int dp[1000];
scanf("%d", &m);
if (m <= 2) {
printf("1\n");
return 0;
}
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i < m; i++) {
/* 两个月前的兔子到今天都可以生小孩了,所以这个月的兔子总数等于上一个月的兔子+两个月前的兔子生的小孩 */
dp[i] = dp[i - 1] + dp[i - 2];
}
printf("%d\n", dp[m - 1]);
return 0;
}