poj1664放苹果 递归

放苹果

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 37040   Accepted: 22806

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

<span style="color:#000000">1
7 3
</span>

Sample Output

<span style="color:#000000">8</span>

Source

lwx@POJ

因为1,2和2,1一样,暂时假设第i个盘子的东西>=第i+1个盘子的东西。则有

1.如果m=0,就只有一种方法(不放);如果n=1,也只有一种(全部放在一个盘子里)。

2.如果n>m,就一定会有m-n个盘子不放苹果,所有那些多出来的盘子可以不考虑,直接求m个盘子有多少种方法

3.除了上面两种情况,m个苹果,n个盘子有两种方法:最后一个盘子放OR不放 ;1.最后一个盘子放的话,前n-1一定也放了,暂且在第n个盘子放一个,那么方法数就等于solve(m-1,n);2.最后一个不放,则方法数为f(m,n-1)

 

#include <iostream>
#include <cstdio>
#include <cstring>

typedef long long LL;
using namespace std;
const int maxn=11;


LL solve(int m,int n)
{
    if(m==0||n==1)
        return 1;
    if(n>m)
        return solve(m,m);
    return solve(m,n-1)+solve(m-n,n);
}
int main()
{
    int T;
    scanf("%d",&T);

    while(T--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%lld\n",solve(a,b));

    }
    return 0;
}

 

posted on 2018-07-26 15:28  一零七  阅读(79)  评论(0编辑  收藏  举报

导航