#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;
}
這里利用分類分別遞歸的思想,通過分析題目可知,不能通過先走一步,減少問題規(guī)模,而是直接分成幾個大類,同時,注意規(guī)劃好邊界條件來終止遞歸。