您的位置:首页 > 编程语言 > Java开发

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

2017-04-02 15:44 519 查看
算法训练 未名湖边的烦恼
时间限制: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);
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: