3.3 放苹果

将递归的问题分解为子问题来做(分类)

3.3 放苹果

当m、n很大时,要用动态规划来做,否则会超时。

3.3 放苹果

3.3 放苹果

主要分为两大类,假设m为苹果数,n为盘子数

当m<n时,此时肯定有空盘子,只需要将m个苹果放进m个盘子中就可以了。f(m,m).

当m>=n时,又要分为两种情况,盘子为空和盘子不为空。

当盘子有空的情况:此时至少要有一个盘子为空,此时就转换成将m个苹果放进n-1和盘子中的问题了。f(m,n-1);

当盘子无空的情况:先将每个盘子中都放一个苹果,此时就转换成将m-n个苹果放进n个盘子中的问题了。f(m-n,n)

#include<iostream>
using namespace std;
int f(int m, int n)//m个苹果,n个盘子 
{
	if(m < n)
	{
		return f(m,m);
	}
	if(m == 0)//没有苹果 
		return 1; 
	if(n <= 0)//没有盘子 
		return 0;
	if(m >=n)
	{
		return f(m,n-1)+f(m-n,n);
	} 
}
int main()
{
	int t,m,n;
	cin >> t;
	while(t)
	{
		t--;
		cin >> m >> n;
		cout << f(m,n) << endl;
	}
	return 0;
}