放苹果(巧用递归)--夏令营

题目

放苹果(巧用递归)--夏令营_第1张图片

 

tips:

1.写递归要有递归边界条件,递归过程就是向边界不断靠近

放苹果(巧用递归)--夏令营_第2张图片

 这里注意:虽然题目给的m,n输入数据范围是>=1的,但不代表边界就是这个;

首先,n=0肯定是不存在的,所以n的边界肯定是1;

其次,m边界为什么可以是0不是1呢,因为当m逐渐减少逼近递归边界时,可能出现(只要可能就必须以更边界的数作为边界数)n>m的情况,这时f(m,m)=f(m,m-1)+f(m-m,m),所以m是可以为0的,既然有更小的数字,就要以更小的数字做边界。

2.放苹果(巧用递归)--夏令营_第3张图片

这里首先根据m,n大小分类;

n<=m时, 分一定有空盘子和一定没有空盘子为分类点。

3.写递归:根据题目写递归原理+写递归条件

答案

#include 
#include
#include
using namespace std;

int f(int m, int n)
{
	if (m == 0 || n == 1)
		return 1;
	if (m < n)
		return f(m, m);
	if (m >= n)
		return f(m, n - 1) + f(m - n, n);
}
int main()
{
	int t; cin >> t;
	while (t--)
	{
		int m, n;cin >> m >> n;
		cout << f(m, n) << endl;

	}
	return 0;
}

你可能感兴趣的:(算法)