Description
Input
Output
Sample Input
1
7 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日
解题体会:对于递归还没有掌握,还需要多加练习