3.3 放苹果
将递归的问题分解为子问题来做(分类)
当m、n很大时,要用动态规划来做,否则会超时。
主要分为两大类,假设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;
}