首先看一下题
描述
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足 1≤n≤31
输入描述:
输入一个int型整数表示第n个月
输出描述:
输出对应的兔子总数
示例1
输入:
3输出:
2
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.有一种兔子,从出生后第三个月起每个月都生一只兔子
2.小兔子长到第三个月后每个月又生一只兔子
3.例子:假设一只兔子第三个月出生,那么它第五个月开始会每个月生一只兔子
4.一月的时候有一只兔子,加入兔子都不死,问第n个月的兔子总数为多少?
5.数据范围:n大于等于1小于等于31
6.输入描述:输入一个int型整数表示第n个月
7.输出描述:输出对应的兔子总数
二、解题思路
1.一开始应该只有一只兔子
2.我们需要计算的是第n个月我们有几只兔子
3.我们每个月增加的兔子的数量,相当于两个月之前存在的兔子的数量
4.我们使用动态规划,第一个月我们有1只兔子
5.第二个月我们还是只有一只兔子
6.第三个月我们有原来的一只兔子加上两个月之前已经存在的一只兔子现在可以生出新的兔子生出的新的兔子,所以是两只兔子
月份 | 1 | 2 | 3 | 4 | 5 |
兔子数量 | 1 | 1 | mon(2)+mon(1)=1+1=2 | mon(3)+mon(2)=2+1=3 | mon(4)+mon(3)=3+2=5 |
三、具体步骤
使用的语言是C
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int dp[32] = {0};
dp[1] = 1;
dp[2] = 1;
for(int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
printf("%d\n", dp[n]);
return 0;
}
还可以用递归的方法
#include <stdio.h>
int countRabbit(int month) {
if(month < 3) {
return 1;
} else {
return countRabbit(month - 1) + countRabbit(month -2);
}
}
int main() {
int n;
scanf("%d", &n);
int num = countRabbit(n);
printf("%d\n", num);
return 0;
}