蓝桥杯-未名湖边的烦恼(java)

                         算法训练 未名湖边的烦恼  
                    时间限制:1.0s   内存限制:256.0MB

            问题描述
              每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
              每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
            输入格式
              两个整数,表示m和n
            输出格式
              一个整数,表示队伍的排法的方案数。
            样例输入
            3 2
            样例输出
            5
            数据规模和约定
              m,n∈[0,18]
              问题分析
              

解题思路:这是一种类似汉诺塔问题的题目,首先要保证换鞋的人m 多于借鞋的人n。否则,无论怎么排序,都是会出现无鞋可借的尴尬局面。

所以,首先判断(m>n),否则返回0,表示没有方法来排序。

package com.sihai.advance;

import java.util.Scanner;

public class Mominghudeyoushang {
    public static int fun(int m,int n)  
    {  
        if(m<n)  
        {  
            return 0;  
        }  
        else if (n==0)  
        {  
            return 1;  
        }  
        else return fun(m-1,n)+fun(m,n-1);  
    } 

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        System.out.println(fun(m,n));
    }
}

注意:这里的return fun(m-1,n)+fun(m,n-1) 前面的fun(m-1,n)意思是还鞋子的一个人站在最前面,之后剩下的哪些人再接着排序,fun(m,n-1) 意思是借鞋子的人站在最后面,剩下的再接着排序。

下面再看一个例子:

爬楼梯问题:
一段楼梯共n级台阶,每次只能走一级或两级,问共有多少种走法?列出n=10时的所有走法。

乍看知道问题感觉还是稍显的有些麻烦,我们这样子来想,假如 n = 7 时,最后一步是会有f(7) = f(5) + f(6)

得在 n = 1和2的时候,我们得到f(1),f(2)为1

所以,我们到下面的公式
这里写图片描述

说白了,这个其实就是斐波那契数列

 package com.sihai.advance;
    public class ClimbStairs {  
        public int stairs(int n) {  
            if (n == 1)  
                return 1;  
            if (n == 2)  
                return 2;  
            else {  
                return stairs(n - 1) + stairs(n - 2);  
            }  
        }  
        public static void main(String[] args) {  
            int n = 7;  
            ClimbStairs cs = new ClimbStairs();  
            int sum = cs.stairs(n);  
            System.out.println(sum);  
        }  

    }  

这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值