放苹果(递归)

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

代码:

#include <iostream>
#include <stdio.h>
using namespace std;
/*
         设f(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论,
         当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即if(n>m) f(m,n) = f(m,m)  
         当n<=m:不同的放法可以分成两类:
         1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1);
         2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即f(m,n) = f(m-n,n).
         而总的放苹果的放法数目等于两者的和,即 f(m,n) =f(m,n-1)+f(m-n,n)
     递归出口条件说明:
         当n=1时,所有苹果都必须放在一个盘子里,所以返回1;
         当没有苹果可放时,定义为1种放法;
         递归的两条路,第一条n会逐渐减少,终会到达出口n==1;
         第二条m会逐渐减少,因为n>m时,我们会return f(m,m) 所以终会到达出口m==0.
*/
int fun(int M, int N){
    if(M == 0 || N == 1){ //考虑到M-N=0
        return 1;
    }
    if(M < N){
        return fun(M,M);
    }else{
        return fun(M,N-1) + fun(M-N,N);
    }
}

int main()
{
    int n,M,N;
    scanf("%d",&n);
    for(int i = 0; i < n;i++){
        scanf("%d %d",&M,&N);
        printf("%d\n",fun(M,N));
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 21:14:34

放苹果(递归)的相关文章

poj 1664 放苹果 递归

题目链接: http://poj.org/problem?id=1664 题目描述: 有n个苹果,m个盒子,盒子和苹果都没有顺序,盒子可以为空,问:有多少种放置方式? 解题思路: 当前有n个苹果,m个盒子. (1):假设当前最少的盒子放置一个苹果,则给m个盒子分别放一个苹果,剩下n-m个苹果. (2):假设当前最少的盒子不放苹果,则剩m-1个box,n个苹果. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <c

放苹果——递归

描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10.输出对输入的每组数据M和N,用一行输出相应的K. 样例输入 1 7 3 样例输出 8 来源[email protected] 思路:很经典的一枚题目,递归,可以找一下函数之间的规律(很简单的). 递归思路:如果盘子数量大于

【递归】放苹果

问题 : [递归]放苹果 题目描述 楚继光刚把油拿到厨房,老妈又大声喊道:“快去把苹果洗了放到盘子里去.” 楚继光要把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5.1.1和1.5.1 是同一种分法. 输入 第1行为一个整数,表示测试数据的数目(测试数据的数目t(0 ≤ t ≤20),第2行为M和N(M和N,以空格分开.1≤M,N≤10). 输出 输出有多少种不同分法. 样例输入 1 7 3 样例输出 8 #include <iostream>

poj1664 放苹果(递归)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1664 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Out

递归训练-放苹果

问题 C: [基础]放苹果 [递归] 时间限制: 1 Sec  内存限制: 128 MB提交: 345  解决: 193[提交][状态][讨论版] 题目描述 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 输入 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. 输出 输出 对输入的每组数据M和N,用一行输出相应的K

POJ 1644 放苹果 递推 递归

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28356   Accepted: 17939 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

北京大学 程序设计与算法(二)递归 放苹果

例题:放苹果 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发?5,1,1和1,5,1是同一种分发. 输入 第一行是测试数据的数目t(0<=t<=20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. 输出 对输入的每组数据M和N,用一行输出相应的K 样例输入 1 7 3 样例输出 8 思路: 设i个苹果放在k个盘子里放法总数是f(I,k),则: k>i时,f(i,k)=f(i,i) k<=i时,总放法=有盘子为空的放

oj放苹果

题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m<=10,1<=n<=10.<=n<=10<=m<=10 样例输入 7 3 样例输出 8 分析: 假设对于m个苹果,n个盘子共有apple(m,n)种方法,那么要想办法递归将m,n的值减小,首先设置递归条件,当m<=1或者n<=1时,apple(m,n)=1:

poj1664-放苹果(递归)

一,题意: M个苹果放在N个盘子里,允许有盘子空着,问共有多少种不同的分法. 二,思路: 递归的思想求解: 1,有反复执行的过程(调用本身) 第一种情况n>m : 必定有 n-m 个盘子空着,去掉不影响. 第二种情况n<=m : i,有至少一个盘子空着; ii,每个盘子都有苹果; 总的放苹果的方法数为两者之和: 2,有跳出反复执行过程的条件(递归出口) 当苹果放完或者只有一个盘子的时候 *递归两条路: i,n会逐渐减少,最终到达出口 n==1 : ii,m逐渐减少,因为n>m时,retu