第3关:青蛙跳台阶问题
任务描述
本关任务:一只小青蛙,每次跳台阶,他可以一下跳一个台阶,或者两个台阶,问假设有n个台阶,这只青蛙一共有多种跳的方法。
题目分析
假设小青蛙最后站在第n阶梯,那么它最后一次是怎么跳上来的呢?可以是跳一级上来,也可以是跳两级上来。假设f(n)是小青蛙跳到n个台阶的方法数。
编程要求
根据提示,在右侧编辑器补充代码,计算n个台阶共有多少总跳法。
测试说明
平台会对你编写的代码进行测试,需要输入的台阶数是大于等于1的整数,如果小于等于0,则返回-1。
测试输入:2
预期输出:2
测试输入:5
预期输出:8
#include<iostream>
using namespace std;
int frog(int n)
{
if(n==1)//剩一个台阶,有一种跳法
{
return 1;
}
else if(n==2)剩两个台阶,有两种跳法
{
return 2;
}
else
{
return frog(n-1)+frog(n-2);//分最后剩一步台阶和最后剩两步台阶的情况,相加
}
}
int main()
{
int n=0,t=0;
scanf("%d",&n);
if(n<=0)//判断输入是否符合
{
t=-1;
}
else
{
t=frog(n);
}
printf("%d",t);
return 0;
}
第4关:猴子吃桃问题
任务描述
猴子第一天摘下若干个桃子,当天吃了一半,后面又多吃一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。后面每天猴子都吃了前一天剩下的一半零一个。到第10天想再吃时,只剩下一个桃子。问第一天共摘了多少桃子。 如果仍然是这种吃法,第15天再吃时,也是只剩下一个桃子,那第一天摘的桃子数又是多少?
题目分析
- 可以倒着思考,第
15
天为最后一天,设桃子数为S(15)
- 已知
S(15)=1
,第14
天,设为S(14)
,去掉它的一半多1个就是S(15)
. - 只要根据
S(n-1)
和S(n)
的关系,就可以用递归求解得到S(1)
。
编程要求
根据提示,在右侧编辑器补充代码,求解到第n天想再吃时,只剩下一个桃子,第一天共摘的桃子数。
测试说明
当输入的天数n
小于1时,返回-1. 平台会对你编写的代码进行测试: 测试输入:4
预期输出:22
#include<iostream>
using namespace std;
int PeachNumber(int n)
{
if(n==1)
{
return 1;//将第15天的数记为第一天的桃子数
}
else
{
return (PeachNumber(n-1)+1)*2;//前一天吃的桃子数为后一天吃的桃子树+1再*2
}
}
int main()
{
int n=0,num=0;
scanf("%d",&n);
if(n<1)//判断输入数是否符合
{
num=-1;
}
else
{
num=PeachNumber(n);
}
printf("%d",num);
return 0;
}
第5关:苹果分筐问题
任务描述
本关任务:有n
个苹果,现分成k
筐,每筐不能为空,有多少种分法? 比如7
个苹果成3
筐,可以是{1,1,5}
, 但这里不考虑顺序,比如我们认为{1,1,5}
,{1,5,1}
和{5,1,1}
是同一种分法。
一种思路
- 考虑第1筐,假设放入
i
个苹果,它不能大于kn
,因为大于该数,就会产生重复的划分。 - 剩下的
n-i
个苹果,继续放到k-1个筐,它的个数不能多于k−1n−i
,不能少于前一筐个数。 - 直到k==1为止。
- 比如输入 7 4
- 按该方法第1筐可放1或2
- 当第1筐放1时,第2筐可以放1或2或3
- 当第1筐放2时,第2筐只可放2或3
- ...
第1筐 | 第2筐 | 第3筐 |
---|---|---|
1 | 1 | 5 |
1 | 2 | 4 |
1 | 3 | 3 |
2 | 2 | 3 |
输入格式
两个整数n,k,(6<n≤200,2≤k≤6)
,中间用单个空格隔开。
输出格式
一个整数,即不同分法。
测试说明
平台会对你编写的代码进行测试:
测试输入:7
3
预期输出:4
#include<iostream>
using namespace std;
//n个苹果分k筐,现在到第now筐
int divideNumber(int n, int k, int now)
{
int count = 0;//计共有多少种方法
if (k == 1)//分到最后一个筐子就算一种分发
{
return 1;
}
else
{
for (int i = now; i <= (n / k); i++)//后一个筐子的苹果个数>=前一个筐子的苹果数量
{
count = count + divideNumber(n - i, k - 1, i);//i为前一个筐子的苹果数量
}
return count;
}
}
int main()
{
int n = 0, k = 0, t = 0;
scanf_s("%d %d", &n, &k);
t = divideNumber(n, k, 1);//初始第一个筐的苹果数量为1
printf("%d", t);
return 0;
}