题目可以描述为,现在有M个苹果,有N个盘子,允许有的盘子是空的,请问会有几种分苹果的方法?
本题的关键是:盘子可以是空的,可以是非空的,根据这一点我们可以知道,每一种方法的状态是,有空盘和没有空盘,那么在一种状态下,可以通过改变每个盘子中苹果的个数来改变每一种方法,来新得到一种方法,那么也就是说通过每一次的递归,由上次的全局状态进行微调,得到当前的局部状态,在下一次的递归中由当前的局部状态来得到新的局部状态,直到遇到递归边界,那么递归边界是什么呢?
苹果都放完了,不可能还有别的局部状态的时候,那么这时候就是一个局部状态,或者是当前的局部状态下,已经缩减到了一个盘子,只存在一个方案的时候,这时候也是结束了。同时需要注意的是,每一次分苹果的过程中,都存在两种状态来决定是否可以进入空盘状态,那就是苹果数量是否大于盘子的数量,假如大于等于,那么可以存在空盘,也可以不存在空盘,假如是小于的,那么必存在空盘,这一点是我们构造递归函数的依据;
下面是代码
#include <iostream>
using namespace std;
int ans=0;
int Solve(int n,int m)/*n为苹果数量,m为盘子数量*/
{
if(n==0||m==1)
{
return 1;
}
if(n<m)/*当苹果数量小于盘子的数量的时候,这时候只得到一种情况*/
{
return Solve(n,n);
}
else/*有空盘和无空盘加起来*/
{
return Solve(n,m-1)+Solve(n-m,m);/*第一个代表是有空盘的情况,多一个空盘*/
/*第二个代表是无空盘的情况,把多余的苹果放到m个去,看发生什么事情*/
}
}
int main()
{
int t;cin>>t;
while(t--)
{
int n,m;cin>>n>>m;
ans=Solve(n,m);
cout<<ans<<'\n';
}
return 0;
}