目录

1 问题描述

2 解决方案

2.1 递归法

2.2 递推法

 


1 问题描述

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

2 解决方案

2.1 递归法

共有m个人还鞋,n个人借鞋,记最终排列数为f(m, n)。

现在求m和n的排队情况,具体理解如下:

起始,要去一人还鞋(PS:此时,m = m - 1),还完后,可以选一人还鞋(PS:m = m - 1)或者一人借鞋(PS:n = n - 1)。

那么,f(m , n) = f(m - 1, n) + f(m, n - 1)。这就是求取f(m, n)的递推公式,那么轻易可知当m < n时,f(m, n) = 0;当n = 0时,f(m, 0) = 1。

具体代码如下:

package com.liuzhen.systemExe;

import java.util.Scanner;

public class Main{
//m代表还鞋的人数,n代表借鞋的人数
public int getArrange(int m, int n) {
if(m < n)
return 0;
if(n == 0)
return 1;
return getArrange(m - 1, n) + getArrange(m, n - 1);
} public static void main(String[] args){
Main test = new Main();
Scanner in = new Scanner(System.in);
// System.out.println("请分别输入还鞋人数m和和借鞋人数n:");
int m = in.nextInt();
int n = in.nextInt();
System.out.println(test.getArrange(m, n)); }
}

运行结果:

请分别输入还鞋人数m和和借鞋人数n:
3 2
5 请分别输入还鞋人数m和和借鞋人数n:
12 7
23256

2.2 递推法

具体代码如下:

package com.liuzhen.systemExe;

import java.util.Scanner;

public class Main{
//m代表还鞋的人数,n代表借鞋的人数
public int getArrange1(int m, int n) {
int[][] result = new int[m + 1][n + 1]; //初始化元素全为0
for(int i = 1;i <= m;i++) {
result[i][0] = 1; //当借鞋的人数为0时,排列只有一种情况
for(int j = 1;j <= n;j++) {
if(i >= j) //当i小于j时,排列总数为0
result[i][j] = result[i - 1][j] + result[i][j - 1];
}
}
return result[m][n];
} public static void main(String[] args){
Main test = new Main();
Scanner in = new Scanner(System.in);
// System.out.println("请分别输入还鞋人数m和和借鞋人数n:");
int m = in.nextInt();
int n = in.nextInt();
System.out.println(test.getArrange1(m, n)); }
}

运行结果:

请分别输入还鞋人数m和和借鞋人数n:
12 7
23256 请分别输入还鞋人数m和和借鞋人数n:
4 3
14

参考资料:

1. 蓝桥杯 算法训练 未名湖边的烦恼

2.算法训练 未名湖边的烦恼【dp+递推】

3.蓝桥--未名湖边的烦恼 (递推)

算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)的更多相关文章

  1. 算法笔记_077:蓝桥杯练习 K好数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4, ...

  2. 算法笔记_061:蓝桥杯练习 字串统计(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然 ...

  3. 算法笔记_123:蓝桥杯第七届省赛(Java语言B组部分习题)试题解答

     目录 1 凑算式 2 方格填数 3 四平方和   1 凑算式 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A ...

  4. 算法笔记_057:蓝桥杯练习 最大的算式 (Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就 ...

  5. 算法笔记_086:蓝桥杯练习 9-2 文本加密(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A"转化"B" ...

  6. 算法笔记_063:蓝桥杯练习 送分啦(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 这题想得分吗?想,请输出“yes”:不想,请输出“no”. 输出格式 输出包括一行,为“yes”或“no”. 2 解决方案 初步一看,这题 ...

  7. 算法笔记_083:蓝桥杯练习 合并石子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...

  8. 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...

  9. 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负 ...

随机推荐

  1. python 简单日志框架 自定义logger

    转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 通常我们在构建 python 系统时,往往需要一个简单的 logging 框架.python 自 ...

  2. 一个菜鸟正在用SSH写一个论坛(2)

    额 一不小心又一个多月没有写过随笔了. 这次是在某次启动服务器的时候报错了: 严重: Exception starting filter struts2 Unable to load configur ...

  3. 解决Linux环境下安装xampp之后外部无法连接MySQL的问题

    在Linux系统下,开发PHP一般都是LAMP环境,对于开发环境来讲,没有必要花太大精力去单独配置LAMP环境,采用xampp一键安装包是一个很好的方式.在Linux系统上安装xampp的过程这里就不 ...

  4. [BZOJ3990][SDOI2015]排序(DFS)

    3990: [SDOI2015]排序 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 902  Solved: 463[Submit][Status][ ...

  5. 【记忆化搜索】codevs2823锁妖塔

    [codevs2823]锁妖塔 Description 琐妖塔会在一会儿后倒塌.大量妖魔涌出塔去,塔内的楼梯都挤满了人(哦,错了,是妖),(那他们怎么不飞下去--)要求是,景天一行一定要下塔,琐妖塔一 ...

  6. 【动态规划】mr368-教主种树

    [题目大意] 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3 ...

  7. Node.js的http模块理解

    Node.js标准库提供了http模块,其中封装了一个高效的HTTP服务器和一个简易的HTTP客户端. http.Server是一个基于事件的HTTP服务器,它的核心由C++编写,兼顾高性能和简易性 ...

  8. Unity中Invoke 和 InvokeRepeating的区别

    Invoke() 方法是 Unity3D 的一种委托机制 如: Invoke("Test", 5);   它的意思是:5 秒之后调用 Test() 方法: 使用 Invoke() ...

  9. mvn在线仓库搜索

    使用Maven进行开发的时候,比较常见的一个问题就是如何寻找我要的依赖,比如说,我想要使用activeMQ,可是我不知道groupId,artifactId,和合适的version.怎么办呢?本文介绍 ...

  10. Win32 error code message

    http://fit.c2.com/fit/files/LispPlatform/lisp/clisp-2.28/src/errwin32.d # Calls a function, passing ...