oj3128——递归之放苹果

问题描述:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问 共有多少种不同的分法?
5,1,1和1,5,1 是同一种分法。
作者:何知令
完成时间:2017年5月7日
输入:第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整 数M和N,以空格分开。1<=M,N<=20。
输出:对输入的每组数据M和N,用一行输出相应的K。
解题思路:解题思路:我们不妨令f(m,n)表示m个苹果放到n个盘子里有多少种放法,下面对不同的情况给予讨论:
(1):当盘子数为1的时候,只有一种放法就是把所有苹果放到一个盘子里。
(2):当苹果数为1的时候,也只有一种放法,注意题目中说明,盘子之间并无顺序,所以不管这个苹果放在哪个盘子里,结果都算一个。
当m=n时,f(m-n,n)中m-n成了0,即是先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,但m=n,故只有一种算法;
(3):当m
(4):当m>=n时,也分两种情况讨论,一种是至少有一个盘子里不放苹果,这样子就相当于f(m,n-1),第二种是,先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,即f(m-n,n);
综上所述:
得到递归表达式:
f(m,n)=1 当 m=1或n=1;
f(m,n)=f(m,m) 当m
f(m,n)=f(m-n,n)+f(m,n-1) 当m>=n;

***********************************************************************************************

代码:

/*
问题描述:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问 共有多少种不同的分法?
5,1,1和1,5,1 是同一种分法。
作者:何知令
完成时间:2017年5月7日
输入:第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整 数M和N,以空格分开。1<=M,N<=20。
输出:对输入的每组数据M和N,用一行输出相应的K。
解题思路:解题思路:我们不妨令f(m,n)表示m个苹果放到n个盘子里有多少种放法,下面对不同的情况给予讨论:
(1):当盘子数为1的时候,只有一种放法就是把所有苹果放到一个盘子里。
(2):当苹果数为1的时候,也只有一种放法,注意题目中说明,盘子之间并无顺序,所以不管这个苹果放在哪个盘子里,结果都算一个。
当m=n时,f(m-n,n)中m-n成了0,即是先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,但m=n,故只有一种算法;
(3):当m
(4):当m>=n时,也分两种情况讨论,一种是至少有一个盘子里不放苹果,这样子就相当于f(m,n-1),第二种是,先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,即f(m-n,n);
综上所述:
得到递归表达式:
f(m,n)=1 当 m=1或n=1;
f(m,n)=f(m,m) 当m
f(m,n)=f(m-n,n)+f(m,n-1) 当m>=n;
***********************************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>

int f(int, int);

int main()
{
    int t, m, n, sum;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%d", &m, &n);
        sum = f(m, n);
        printf("%d\n", sum);
    }
    return 0;
}
int f(int m, int n)//递归时不要想基本运算式是什么,只要把所有的情况全考虑到即可(最重要的是最根本的几个值)
{
    if (m<n)
        return f(m,m);
    if (n==1||m==1||m==0)
        return 1;
    return f(m-n,n)+f(m,n-1);
}
程序运行结果展示:

知识点总结:递归

学习心得:不是我写的,但一直在试图理解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值