题解:首先分类讨论,找到递归的边界和公式。
1.当m<=1或者n=1的时候,这时候只有一种放法,答案为1。
2.当m<n的时候,其结果与check(m,n)是一样的。
3.当m>=n的时候,考虑如果这个时候保留一个空的盘子,那么,答案为check(m,n-1)
如果每个盘子都有苹果,那么首先我们拿出n个苹果放在n个盘子上,这个时候还有m-n个苹果还没有被分配,那么最后结果其实就与这m-n个苹果的放法一样。
所以在第三种情况下结果为check(m,n-1)+check(m-n,n)。
特别要注意的是,虽然题目说了m>=1,但是为了防止在第三种情况计算check(m-n,n)的时候m-n<=1的情况出现,所以这个时候我们把第一种情况的边界设置为m<=1。
代码如下:
#include<iostream>
using namespace std;
int check(int num,int inx)
{
if(num< =1||inx==1) return 1;
if(inx>num) return check(num,num);
if(inx<=num) return (check(num,inx-1)+check(num-inx,inx));
}
int main( )
{
int t;
cin>>t;
while(t--)
{
int m,n;
cin>>m>>n;
cout<<check(m,n)<<endl;
}
return 0;
}