此题是整数划分问题的扩展:
f(m,n)表示m个苹果放在n个盘子的放法数目。
如果m<n,则n-m个盘子永远为空,所以f(m,n)=f(m,m);
如果m>=n,则有两种情况:
若n个盘子至少存在一个为空,则f(m,n)=f(m,n-1);
若n个盘子都不空,可以从每个盘子中都拿走一个苹果,不影响不同放法的数目,则f(m,n)=f(m-n,n);
递归终止:当只有1个盘子或者没有苹果时,只有一种放法。
#include<iostream>
using namespace std;
//m个苹果放在n个盘子的放法数目
int f(int m,int n)
{
if(n==1 || m==0) return 1;
if(m<n) return f(m,m);
else return f(m,n-1)+f(m-n,n);
}
int main()
{
int t;
cin>>t;
int m,n;
while(t--)
{
cin>>m>>n;
cout<<f(m,n)<<endl;
}
return 0;
}