poj 1664放苹果(递归)

放苹果
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 37377   Accepted: 23016

Description

把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

对于m个苹果,n个盘子f(m,n):

如果m<n,那么就跟m个盘子,m个苹果是一样的f(m,m)。

如果m>n,那么有两种情况:一种有空盘子的情况,一种没有空盘子的情况,两种情况不重叠且加一起一定为情况总数。

第一种情况:m个苹果放在n-1个盘子里,因为至少有1个空盘子,即f(m,n-1)

第二种情况:每个盘子都至少有一个苹果,m-n个苹果再放到n个盘子里,即f(m-n,n)。

由上面两种情况得到递归式f(m,n)=f(m,n-1)+f(m-n,n)。

#include<iostream>
#include<cstring>
using namespace std;
const int maxm=10000;
int m[maxm],n[maxm],k[maxm];//m是苹果树,n是盘子数
int putApple(int m,int n)
{
  if(m==0||n==1)
    return 1;
  else if(n>m) 
    return putApple(m,m);
  else 
    return putApple(m,n-1)+putApple(m-n,n);
}
int main()
{
  memset(k,0,sizeof(k));
  int t;
  cin>>t;
  for(int i=1;i<=t;i++)//一次性输入
  {
    cin>>m[i]>>n[i];    
  }
  for(int i=1;i<=t;i++)//一次性输出
  {
    k[i]=putApple(m[i],n[i]);
    cout<<k[i]<<endl;
  }
  return 0;
} 
 
原文地址:https://www.cnblogs.com/-citywall123/p/9510601.html