博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)
阅读量:5061 次
发布时间:2019-06-12

本文共 2090 字,大约阅读时间需要 6 分钟。

目录

 

 


1 问题描述

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

 

 

 


2 解决方案

2.1 递归法

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

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

起始,要去一人还鞋(PS:此时,m = m - 1),还完后,可以选一人还鞋(PSm = 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 25请分别输入还鞋人数m和和借鞋人数n:12 723256

 

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 723256请分别输入还鞋人数m和和借鞋人数n:4 314

 

 

 

参考资料:

   1. 

   2.

   3.

转载于:https://www.cnblogs.com/liuzhen1995/p/6493068.html

你可能感兴趣的文章
js中比较实用的函数用法
查看>>
安装预览版镜像后无法检测到预览版更新的解决方案
查看>>
【bzoj5099】[POI2018]Pionek 双指针法
查看>>
别让安全问题拖慢了 DevOps!
查看>>
JAR打包和运行
查看>>
session如何保存在专门的StateServer服务器中
查看>>
react展示数据
查看>>
测试计划
查看>>
idea设置自定义图片
查看>>
[高级]Android多线程任务优化1:探讨AsyncTask的缺陷
查看>>
选择器
查看>>
rownum 的使用
查看>>
Mysql与Oracle 的对比
查看>>
MVC系列博客之排球计分(三)模型类的实现
查看>>
npm安装
查看>>
阅读笔记02
查看>>
2019年春季学期第二周作业
查看>>
2014北邮计算机考研复试上机题解(上午+下午)
查看>>
mySQL 教程 第7章 存储过程和函数
查看>>
OGG同步Oracle到Kafka(Kafka Connect Handler)
查看>>