您的位置:首页 > 其它

poj 1663 放苹果

2016-09-08 10:28 218 查看
题意: 把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

思路: 想法其实很简单,直接fn(m,n)递归求解。m表示苹果树,n表示盘子数。主要分为两种情况。

1、m<n 的情况, fn(m,n)=fn(m,m) ,很好理解m个苹果最多能放m个盘子,又因为盘子都一样。

2、m>=n, fn(m,n)=fn(m−n,n)+fn(m,n−1) ,这个式子表示,先把每个盘子里放一个苹果在放其他的也就是fn(m−n,n),留一个空盘子不放也就是fn(m,n−1) 。

最后结束递归的条件是fn(m,n) if(m==0||n==1||m==1) 时返回1。

AC代码:

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>

using namespace std;
#define ll long long
#define eps 1e-8
const ll maxn = 100005;
const ll mod = 1e9+7;

ll fn(ll m,ll n)///int型的也可以
{
if(m==0||n==1||m==1)
return 1;
if(n>m)
return fn(m,m);
else
return fn(m,n-1)+fn(m-n,n);
}

int main()
{
int T;
ll m,n;
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d",&m,&n);

printf("%I64d\n",fn(m,n));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递归