算法学习——递归之排队购票问题

算法描述

一场球赛开始前,售票工作正在紧张的进行中.每张球票为50元,现有m+n个人排队等待购票,其中有m个人手持50元的钞票,另外n个人手持100元的钞票.假设开始售票时售票处没有零钱,求出m+n排队购票,

算法思路

定义函数f(m,n)表示m个人手持50元,n个人手持100元共有的排队种数

  1. 当n=0,没有手持100元的人排队,这个情况是找得开钱 f(m,0) =1
  2. 当m<n,(手持50元的人数小于手持100元的人数) f(m,n)=0
  3. 其他情况

    当第m+n个人手持100元,他之前的m+n-1个人有m个人手持50元,n-1个人手持100元,共有的排队种数为f(m,n-1)

当第m+n个人手持50元,他之前的m+n-1个人有m-1个人手持50元,n个人手持100元,共有的排队种数为f(m-1,n)

根据上述情况可得到

递归公式f(m,n)=f(m-1,n)+f(m,n-1)

递归出口n=0 f(m,0)=1 m<n f(m,n)=0

算法实现

    Scanner scanner = new Scanner(System.in);
    int m = scanner.nextInt();
    int n = scanner.nextInt();
    scanner.close();
    long temp = digui(m, n);
    System.out.println(temp);
}
public static long digui(int m,int n){
    if(n==0){
        return 1;
    }else if(m<n){
        return 0;
    }else{
        return digui(m-1,n)+digui(m,n-1);
    }
}

结果

原文地址:https://www.cnblogs.com/kexing/p/9685930.html

时间: 2024-11-20 13:32:40

算法学习——递归之排队购票问题的相关文章

算法学习 - 递归与非递归,位运算与乘除法速度比较

递归调用非递归调用 运行时间比较 结论 位运算与乘除法 结论 递归调用/非递归调用 我们都知道,很多算法,都是用递归实现的.当然它们同时也是可以用非递归来实现. 一般我们在对二叉树进行遍历的时候,还有求斐波那契数的时候,递归是非常简单的.代码容易懂,好实现. 但是递归的时候,有一个问题,就是需要压栈.为什么要压栈呢?因为当我在函数内部调用自身的时候,要中断当前的操作继续跳转到下一次的实现,而当前运行的状态要保存起来.所以就把当前状态进行压栈,等到运行到递归条件结束的时候,再弹栈. 所以递归就是需

算法学习——递归

递归算法是把问题转化为规模缩小了的同类问题的子问题.然后递归调用函数(或过程)来表示问题的解. 一般来说 ,能够用到递归解决的问题应该满足以下三个条件: (1)待解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题相同,只是在数量规模上会有所不同: (2)递归调用的次数必须是有限的; (3)必须有结束递归的条件来终止递归. 以下是一些用到递归的简单实例: eg_Fibonacci数列: int Fib(int n) { if(n==1||n==2) return (1);

算法学习---递归

//递归之Hanoi塔问题 #incude<iostream> using namespace std; void hanio(int a,int b,int c,int n) { if(n>0) { hanoi(n-1,a,c,b); //表示将塔座a上自上而下,由大到小叠在一起的n个圆盘 依移动规则移至塔座b上并仍按 同样顺序叠排 move(n,a,b); //表示将塔座a上编号为n的圆盘移动到塔座b上 hanoi(n-1,c,b,a); } } //递归之整数划分问题 int q(

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

学习递归时,影响到的一个算法问题

当年学习递归,有一个例子是 1,1,2,3,5,8,13......这样求第N个数的值. 当时还颇为认同其递归的巧妙. 后来去携程面试,还被问到,心里暗爽,这不是送分吗.俩分钟再小黑板上写出了递归的实现,被瑞亮总给分析了说是个O(n*n).还觉奇怪,为啥点了下这个 今天温习算法时,看到关于深度搜索和宽度搜索时,想到这个题目,重新思考了下.顿时觉得当时面试时,瑞亮总当时给留了面子. 下边是今天想到的O(N)的实现方法. int n =7; ArrayList<Integer> list = ne

zstu深入浅出学算法020——DP——排队购票

Description 一常球赛开始前,售票工作正在进行中.每张球票为50元,现有k(1 <= k <= 30)人排队购票,其中n人手持50元的钱,剩余m人手持100元的钱,假设开始时售票处没有钱,求出售票处不出现找不开钱的不同排队种数(拿同样钞票面值的人换位置视为同一种排队) Input 多组测试数据,先输入整数T表示组数,然后每组输入2个整数n和m Output 对于每组测试数据输出1行,值为题目描述中的排队种数 Sample Input 2 1 2 1 1 Sample Output 0

周总结(2017.2.16):第一周算法学习。

周总结:算法学习总结之DFS和BFS 一:DFS算法 目的:达到被搜索结构的叶节点. 定义:假定给定图G的初态是所有的定点都没有访问过,在G中任选一定点V为初始出发点,首先访问出发点并标记,然后依次从V出发搜索V的每个相邻点W,若W未曾出现过,则对W进行深度优先遍历(DFS),知道所有和V有路径相通的定点被访问. 如果从V0开始寻找一条长度为4的路径的话: 思路步骤: 先寻找V0的所有相邻点:dis{v1,v2,v3},V1没有访问过,所以对V1进行深度遍历并将V1标记为访问过,此时路径长度为1

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

数据结构与算法5: 递归(Recursion)

数据结构与算法5: 递归(Recursion) 写在前面 <软件随想录:程序员部落酋长Joel谈软件>一书中<学校只教java的危险性>一章提到,大学计算机系专业课有两个传统的知识点,但许多人从来都没搞懂过,那就是指针和递归.我也很遗憾没能早点熟练掌握这两个知识点.本节一些关键知识点和部分例子,都整理自教材或者网络,参考资料列在末尾.如果错误请纠正我. 思考列表: 1)什么程序具有递归解决的潜质? 2)递归还是非递归算法,怎么选择? 3)递归程序构造的一般模式 1.递归定义 首要引