Input
Output
Sample Input
1
7 3
Sample Output
8
f(m, n) = f(m-n, n) + f(m, n-1) f(m, n): 把m个苹果放到n个盘子中的方法数有2种方法可以得到递归式【转贴】:
f(m, n-1): 把m个苹果放到n-1个盘子中的方法数(其中至少有一个空盘子)
f(m-n, n): 把m个苹果放到n个盘子中,而且每个盘子中都有苹果(先拿n个出来,等m-n个放好了,然后每个盘子放一个)
下面给出两种方法求h(m,n),g(m,n)关于自身的递归公式
(一)利用h(m,n)=sum(g(m,i),i=1..n)
(a)求h(m,n)的递归公式
h(m,n)=sum(g(m,i),i=1..n)
=sum(h(m-i,i),i=1..n)
=h(m-n,n)+ sum(h(m-i,i),i=1..n-1)
=h(m-n,n)+h(m,n-1)
(b)求g(m,n)的递归公式
g(m,n)=h(m-n,n)
=sum(g(m-n,i),i=1..n)
=g(m-n,n)+ sum(g(m-n,i),i=1..n-1)
=g(m-n,n)+ sum(g((m-1)-(n-1),i),i=1..n-1)
=g(m-n,n)+g(m-1,n-1)
(二)直接从意义上获得递归公式
(a)求h(m,n)的递归公式
h(m,n)可以分为至少一分为空h(m,n-1)和一分都不为空h(m-n,n)
h(m,n)=h(m-n,n)+h(m,n-1)
(b)求g(m,n)的递归公式
g(m,n)可以分为至少一分为1即g(m-1,n-1)和一分都不为1即g(m-n,n)
g(m,n)=g(m-n,n)+g(m-1,n-1)
#include < iostream >
using namespace std;
int f( int m, int n)
{
if(m==0||m==1) return 1;
if(n==0||n==1) return 1;
if(m<n) return f(m,m);
else return f(m-n,n)+f(m,n-1);
}
int main()
{
int t=0;
int m,n;
cin>>t;
while(t--)
{
cin>>m>>n;
cout<<f(m,n)<<endl;
}
return 0;
}
![]()