递归—北大POJ 1664 放苹果(集合划分系列,还需再看)

来源:互联网 发布:java大视频断点续传 编辑:程序博客网 时间:2024/05/21 19:37
                                                                     放苹果

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

17 3

Sample Output

8

 

AC代码:

#include<stdio.h>
int f(int m,int n)
{
    if(m==0)                                       //当没有苹果时只有一种情况
    return 1;
   
    if(n==1)                                       //当只有一个盘子时也是只有一种情况
    return 1;
   
    if(m<n)                                       //当苹果少于盘子数时,不论怎样放至少会有(n-m)个盘子空着,所以就相当于m个苹果和m个盘子
    return f(m,m);
   
    if(m>=n)                                    //当苹果多于或等于盘子数时有两种情况:1.至少有一个盘子空着:f(m,n-1)
    return f(m,n-1)+f(m-n,n);       //2.所有的盘子都不空时相当于每个盘子可以去掉一个苹果,即每次有(m-n)个苹果
  /* 递归出口条件说明:
         当n=1时,所有苹果都必须放在一个盘子里,所以返回1;
        当没有苹果可放时,定义为1种放法;
        递归的两条路,第一条n会逐渐减少,终会到达出口n==1;
        第二条m会逐渐减少,因为n>m时,我们会return f(m,m) 所以终会到达出口m==0.*/ 
}
int main()
{
    int m,i,n,k;
    scanf("%d",&m);
    while(m--)
    {
    scanf("%d%d",&n,&k);
    printf("%d\n",f(n,k));
    }
    return 0;
}

 


这道题的关键点:1.分析全所有的放苹果的情况,列出递归方程 2.找出临界条件,即递归出口

解题时间:2014年8月1日

解题体会:对于递归还没有掌握,还需要多加练习

0 0