您的位置:首页 > 其它

POJ 1664 放苹果

2015-05-03 23:13 211 查看
放苹果

Time Limit: 1000MSMemory Limit: 10000K
Total Submissions: 27475Accepted: 17427
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

分析:

当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即if(n>m) fun(m,n) = fun(m,m)  

当n<=m:不同的放法可以分成两类:

1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1);

2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即fun(m,n) = fun(m-n,n).

总的放苹果的放法数目等于两者的和,即 fun(m,n) =fun(m,n-1)+fun(m-n,n)

递归出口条件:

当n=1时,所有苹果都必须放在一个盘子里,所以返回1;

当没有苹果可放时,定义为1种放法;

递归有两条路,第一条n逐渐减少,最终到达n==1; 第二条m逐渐减少终会到达出口m==0.

#include <iostream>

using namespace std;

int getGroupNum(int m,int n)

{

if(n ==1|| m == 0 )

return 1;

if(n>m)

return getGroupNum(m,m);

else

return getGroupNum(m-n,n)+getGroupNum(m,n-1);

}

int main()

{

int t = 0;

cin>>t;

if(t >= 0 && t<= 20)

{

while(t--)

{

int m = 0;

int n = 0;

cin>>m>>n;

if(m>=1 && n<=10)

cout<<getGroupNum(m,n)<<endl;

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: