#include <iostream>
using namespace std;
int setapple(int m,int n){//m个苹果,n个盘子
if(n==0){
return 0;
}
if(m==0){
return 1;
}
//必然会空的盘子就可以去掉
if(n>m){
return setapple(m,m);
}
else{
//分为两种情况,一种是有盘子为空的放法,即第二个表达式,先空出一个盘子,把问题简单化
//一种是没有盘子为空的放法,即第一个表达式,先把每个盘子先放一个再说
return setapple(m-n,n)+setapple(m,n-1);
}
}
int main()
{
int t,m,n;
cin>>t;
while(t--){
cin>>m>>n;
cout<<setapple(m,n)<<endl;
}
return 0;
}
这里利用分类分别递归的思想,通过分析题目可知,不能通过先走一步,减少问题规模,而是直接分成几个大类,同时,注意规划好边界条件来终止递归。