放苹果

来源:互联网 发布:破解winrar密码软件 编辑:程序博客网 时间:2024/04/28 04:34
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

Input

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

Output

对输入的每组数据M和N,用一行输出相应的K。

Sample Input

1
7 3

Sample Output

8

f(m, n) = f(m-n, n) + f(m, n-1)f(m, n): m个苹果放到n个盘子中的方法数

f(m, n-1):
m个苹果放到n-1个盘子中的方法数(其中至少有一个空盘子)

f(m-n, n):
m个苹果放到n个盘子中,而且每个盘子中都有苹果(先拿n个出来,m-n个放好了,然后每个盘子放一个)
  有2种方法可以得到递归式【转贴】:

下面给出两种方法求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)可以分为至少一分为1g(m-1,n-1)和一分都不为1g(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==1return 1;
 
if(n==0||n==1return 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;
}





原创粉丝点击