算法数学基础-排列组合(题目取自牛客网)

2023-05-16

基础理论:

  1. 排列

有限集的子集按某种条件的序化法排成列、排成一圈、不许重复或许重复等。
从n个不同元素中每次取出m(1≤m≤n)个不同元素,排成一列,称为从n个元素中取出m个元素的无重复排列或直线排列,简称排列
在这里插入图片描述
五个字母全排列有5!=120

  1. 组合

从n个不同元素中每次取出m个不同元素(0≤m≤n),不管其顺序合成一组,称为从n个元素中不重复地选取m个元素的一个组合。
所有这样的组合的总数称为组合数,这个组合数的计算公式为:
在这里插入图片描述

1、对于相同元素的有序分组问题(利用隔板法)

参考博客:http://www.sohu.com/a/230556468_301997

【例1】现有7个完全相同的小球,将它们全部放入编号为1,2,3,4的四个盒子中,每个盒子至少放一个球,问有多少种不同的放法?

【思路点拨】这道题满足隔板法基本模型的三大条件(1.有若干个相同的元素;2. 将元素有序分组,每组至少有一个元素;2. 元素不能有剩余),所以我们可以直接应用隔板法。首先我们将7个小球排成一排。在7个小球中间一共有6个间隔,在这6个间隔中我们挑出3个间隔插入隔板,这样我们就将小球分成了四份,并且每一份都至少有一个小球。接着我们将这四份小球按从左到右的顺序依次放入1-4号四个盒子中,就得到了对应的一种放法。这样一来,每一种隔板的插法就对应了一种小球的方法。6个间隔中插入3个隔板的插法共20种,即本题共有20种不同的放法。

【方法总结】将个相同的元素有序的放入个盒子中(不允许空盒),相当于在个间隔中插入个隔板,因此不同的放法与不同的隔板插法种数相同,共有种放法。这里的是组合数种的基本公式,其计算公式为【 组合C(n,m)=P(n,m)/P(m,m) =n!/m!(n-m)!】。

n=6,m=3

2、变式(1):受限制分组问题

【例2】现有12个完全相同的小球,将它们全部放入编号为1,2,3,4的四个盒子中,每个盒子至少放两个球,问有多少种不同的放法?

【思路点拨】每个盒子我只要至少放一个球就可以啦。也就是说只要让每个盒子里提前都装入一个球,那就可以用隔板法。
所以先拿出4个球,分别装入四个盒中,现在每个盒子里都有1个球了!这样一来问题就变成了将剩下8个相同的球,有序地装入四个盒子中,每个盒子中至少放入1个球,有多少种放法?这还不简单,直接应用刚才基本隔板法模型的结论,在7个间隔中插入3个隔板。

【方法总结】本题为隔板法的变式,原理在于需要先在每个盒子中放入一定数量的小球,再转化为隔板法的基本模型。总结如下:将个相同的元素有序的放入个盒子中(每个盒子中至少放入个元素,),需要先在每个盒子中放入个元素,再将剩余元素利用隔板法放入个盒子中

n=7 m=3

【例3】现有12个相同的小球,将它们全部放入编号为1,2,3,4的四个盒子中,要求每个盒子中的小球个数不小于其编号数,问不同的放法有多少种?

【思路点拨】这道题和例2有些类似,必须要先在某些盒子中放入某个数量的小球,才能转化为隔板法解决。比如2号盒子中最终至少要有2个小球,所以考试君在2号盒子中先放入1个球。同理在3号盒子中先放入2个球,4号盒子中先放入3个球。这样保证每个盒子中只需要再至少放入1个球就可以达到要求。故对剩余6个球用隔板法放入四个盒子中.

【方法总结】本题同样为隔板法的变式,总结如下:当每个盒子均不是空盒且元素数量要求不同时,我们需要先放入一定数量的元素,使得每个盒子中只需要再至少放入1个元素就可以达到要求。再对剩余的元素利用隔板法放入盒子中。

n=5,m=3;

【例4】现有8个完全相同的小球,将它们全部放入编号为1,2,3的三个盒子中,允许出现空盒,问有多少种不同的放法?

【思路点拨】我们先借3个球(有多少个盒子借多少个),让我用隔板法分个球”。成功地借到了3个球之后,这时候我们就可以这样来操作。加上原来地8个球,现在共有11个球,利用隔板法将它们放到三个盒子中,共有种放法。对于每一种放法,考试君都从每个盒子中拿出一个球还回去。当盒中分到一个球之后还回1个球,该盒实际上是空盒;分到两个球后还回1个球,该盒实际上只含一个球,依此类推。这样就成功地将8个相同的小球分入了三个盒中,允许有空盒的共有45种放法。

【方法总结】将个相同的元素有序的放入个盒子中(允许空盒),需要先通过外部力量另外借到个相同的元素,转化为将个元素用隔板法放入个盒子中(最后每个盒子都拿出一个球还回去),所以共有种放法。

n=10,m=3

编程例题
将20个球放进12个不同的袋子,每个袋子可以放0-20个球,有多少种放法?分析如何计算,然后编程解答。

进阶问题:每个袋子只能放0个、2个或3个球,该如何计算?

链接:https://www.nowcoder.com/questionTerminal/b01b4a95413040eaa1effbd34280c78c
来源:牛客网

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
//        写入球的个数
         int ball;
//        写入袋子的个数
         int pack;
         Scanner scan = new Scanner(System.in);
         System.out.println("请输入球的个数");
         ball = Integer.parseInt(scan.next());
         System.out.println("袋子个数");
         pack = Integer.parseInt(scan.next());
         System.out.println(getban(ball, pack));
         
    }
    
    
//    隔板法
    public static long getban(int ball,int pack)
    {
//        由于无法保证每个袋子都能装上一个球,无法使用隔板法,
//        所以故意往每个袋子加1个球,当排序的时候可以往每个袋子里减一个球就可以了
        long result = 1;
        int newball = ball + pack;
//        所以每个球的空隙有newball -1个
        int newballair = newball -1;
//        因为需要放入12-1个袋子(插入12-1块板),所以用公式C(newballair,pack-1)
        /*
         * C(m,n) = m!/n!*(m-n)!
         */
        for(int i = newballair - (pack - 1) + 1; i <= newballair ; i++)
        {
            result *= i; 
        }
        return result / factorial(pack-1);
    }
    
//    阶乘方法
    public static long factorial(int num)
    {
        if(num == 1)
        {
            return 1;
        }
        else
        {
            return num * factorial(num-1);
        }
    }
}

例题2:五个球从盒子里拿出来,打乱顺序放回去,均不在原位的排列数是多少()

思路:首先我们可以把五个球看成abcde,然后分为以下五种情况来排列

  1. 首先,a放在任意位置(想象成a右移),则有四种不同的排列
  2. a占b的位置,则cde有两种排列方式,分别是ecd和dec(e的两次右移)
  3. a不占b的位置(a,b不交换位置),B的位置没有被A占:则B的位置有3种选择,C的位置有3种选择(因为A在这3个里面,A无论在CDE的哪个位置上,都没有问题,只要A的位置定了,另外两个的位置肯定也定了,因为它们只能交换位置),所以是 3*3种

概率题
https://www.asklib.com/view/12798def.html

例子:
1000个钱币中有10个金币,取一次钱币是金币的概率为0.1,取两次呢,取n次呢

思路:求得每次取不到的概率,用1减去这个概率即可。

dp[n]=990-(n-1)/1000-(n-1) *dp[n-1],dp[0]=1
最终结果1-dp[n]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法数学基础-排列组合(题目取自牛客网) 的相关文章

  • SpringBoot整合mybatis实现增删改查

    文章目录 一 前言二 配置pom文件引入依赖三 实现增删改查1 目录结构2 application yml 配置3 entity4 mapper5 service6 controller 四 mysql建库建库语句五 调试接口1 创建 ht
  • 双系统启动界面自定义美化设置

    装了Windows和Ubuntu双系统的小伙伴会发现Ubuntu系统附带安装的GNU GRUB多操作系统启动管理界面非常简单 xff0c 不太符合现在主流的UI界面设计理念 xff0c 那如何才能让启动界面变得更美观让人看着更舒服一些呢 x
  • CNN网络实现手写数字(MNIST)识别 代码分析

    CNN网络实现手写数字 xff08 MNIST xff09 识别 代码分析 自学用 Github代码源文件 本文是学习了使用Pytorch框架的CNN网络实现手写数字 xff08 MNIST xff09 识别 导入需要的包 span cla
  • U盘安装Windows10系统报错无法打开文件install.wim原因及解决办法

    1 现象描述 xff1a 毕业后买了一台联想Y7000P笔记本电脑用了一年左右 xff0c 换了工作后一直用的公司Mac笔记本 xff0c 就这样联想笔记本闲置几年再次使用时系统更新一下 xff0c 卡的要死就想重新安装一下系统 xff0c
  • Spring JPA native query 分页错误记录

    相信大家对SpringData JPA 自定义分页查询已经很熟悉了 xff0c 今天博主遇见了一个奇怪的问题 xff0c 记录下来 xff0c 跟大家分享 根据已经学习到的知识 xff0c 对于 64 Query nativeQuery 6
  • python 重复输出字符串

    阿里云大学人工智能学前小测验 Python测试 7 a 61 1 b 61 a 2 输出b的值为 A 1 B 2 C 11 D null 我选的答案是D xff0c 结果 答案是C xff0c 因为python可以通过str 2重复输出字符
  • socket中文乱码问题

    问题描述 xff1a 后端向前端发送中文 xff0c 前端显示正常 前端向后端发送中文 xff0c 后端显示乱码 解决 xff1a 前端js引入 最新版的 socket io js xff0c 不能使用socket io min js sp
  • python 将字符串小数 转换为 整型

    问题描述 xff1a 直接使用int函数将字符串类型的小数转换为 int型会报错 问题解决 xff1a 先转换为float型 xff0c 再转换为 int 型
  • MySQL binlog设置和查看命令

    目录 开启binlog重置命令查看binlog 开启binlog span class token comment 编辑模式进入 etc my cnf span span class token function vim span etc
  • kafka3.1 简介 (一)

    kafka3 1 简介 xff08 一 xff09 主要概念和术语事件流 xff08 Event streaming xff09 服务器 xff08 server xff09 与客户端 client serversclient 事件 xff
  • 作为一名普通的程序员,聊聊这四年的工作感悟

    之前有些小伙伴一直想听我分享更多有关我的工作内容的事情 xff0c 今天就来和大家分享一下 我是一名普通的程序员 xff0c 这四年来我的工作内容发生了哪些变化 xff0c 以及我有哪些感悟 我是16届的毕业生 xff0c 我的第一份工作是
  • js页面跳转的时候使用 post发送数据

    需求背景 页面跳转的时候需要带一些参数 xff0c 但是又不想让这些数据展示给用户 xff0c 所以需要使用post实现跳转 代码实现 span class token comment 点击进入项目详情页面 span window span
  • flask返回页面和数据,js获取数据

    flask 返回数据 span class token keyword if span request span class token punctuation span method span class token operator 6
  • git 将本地分支与远程分支关联

    需求背景 项目在远程新建了一个分支 xff0c 但是本地没有这个分支 xff0c 需要在本地开发完之后 xff0c 将最新的代码放到 远程分支上 问题一 xff1a 本地没有这个分支 远程新建了一个分支 xff0c 但是本地并没有这个分支
  • python 分割字符串,只分割一次

    需求背景 在开发过程中 xff0c 需要对部分字符串进行切割 xff0c 但是这个字符串是用户输入的 xff0c 用户可能会输入下划线 xff0c 如果只是单纯的分割 xff0c 则分割的结果不对 xff0c 需要对这个进行处理 解决方案
  • mysql查询其中一个字段 和 查询所有字段效率比较

    第一种 查询所有 xff0c 10000次 xff0c span class token keyword sql span span class token operator 61 span span class token string
  • tr td设置内边距 和 外边距

    tr tr xff1a 设置 margin 和 padding 都无效 td td xff1a 设置 margin无效 设置 padding有效
  • apppium 两个H5页面之间进行切换pagesource打印出的是上个页面的信息

    背景 当前项目有很多个H5界面 xff0c 在进行上下文切换的时候 xff0c 发现打印的pagesource是上一个H5页面的元素 原因 H5页面需要 chromedrive exe进行加载 xff0c 需要杀掉上一个页面的 chrome
  • uiautomatorviewer手机横屏显示截图调整为竖屏

    背景 手机app部分界面是横屏显示 xff0c 但是 uiautomatorviewer是竖屏显示 解决方案 将竖屏的图片 保存下来 xff0c 然后将图片旋转为横屏 再次打开 解决 1 点击保存按钮 xff0c 保存这个图片 2 将图片调
  • 版本管理-创建git仓库

    创建git仓库 把已有的项目代码纳入git管理 span class token builtin class name cd span 项目代码所在文件夹 span class token function git span init 新建

随机推荐

  • git 撤销commit

    撤销未push的commit span class token comment 用户已经执行的操作 span span class token function git span span class token function add
  • Django整理01:启动流程

    目录 启动 启动 span class token comment 启动命令 xff1a span python manage py runserver span class token comment 运行先文件的handler函数 sp
  • 差量更新问题记录

    问题 xff1a 升级后台配置了差量更新 xff0c 但是用户设备检测到的是全量更新 xff0c 测试设备检测到的是差量更新 原因 xff1a 差量更新需要具备的条件 xff1a 1 升级后台配置了差量更新的链接 2 设备对应的目录下有ba
  • Linux操作系统的启动过程

    Linux操作系统的启动过程 一 Linux操作系统的开机过程二 初始化进程服务三 服务管理命令 一 Linux操作系统的开机过程 Linux操作系统的开机过程可简记为 xff1a 两次检测 xff0c 一次装载 即首先对BIOS做初始化
  • manifest.json参数详解

    从官网文档翻译而来 xff0c 比大多数网上现有资源详细很多 xff0c 部分官网没有的属性通过stackoverflow xff0c 甚至是chromium源码查询而来 还有一些没注释的是查询不到或者本人无法确定的 官方文档地址 xff1
  • C语言经典例25-阶乘累加求和

    目录 1 题目2 分析3 实现4 运行结果 1 题目 求1 43 2 43 3 43 43 20 的和 2 分析 本题的本质就是求阶乘 xff0c 观察规律可以发现 xff0c 1 1 1 和
  • centos7 双击程序启动不了

    1 在终端输入ldd test 查看程序依赖的库 2 如果依赖库都存在 xff0c 双击程序启动不了 xff0c 但是在终端输入 test 却可以启动 原因解释 xff1a 在终端输入的程序是带路径的 xff0c 双击的时候是不带路径的 x
  • Ubuntu修改密码及密码复杂度策略设置方法

    版本查看 cat span class token operator span etc span class token operator span issue cat span class token operator span proc
  • 2022小米红米手机最新最全MIUI刷机教程内测版到稳定版 不清除数据(线刷、卡刷)

    文章目录 方法1 xff1a 解锁 线刷手机解锁解锁软件接入电脑刷机工具下载下载刷机包线刷 方法2 xff1a 小米助手卡刷包下载小米助手PC客户端打开手机USB调试模式连接小米助手卡刷miui卡刷包下载 起因是因为意外升级了一版内测版mi
  • TreeSet录入重复的元素及保证录入&输出顺序一致的Java实现

    Java萌新在学习路上遇到的一个扯dan的问题解法 知识点 Set TreeSet TreeSet自然排序 TreeSet比较器排序 Comparator 原题目 请编写main 方法 xff0c 按以下要求顺序 循环接收控制台录入的字符串
  • SpringBoot无法访问static文件夹 404问题

    使用spring boot 配置好后端 导入前端页面到resources 61 gt static 文件夹后 无法访问 但此时进入调试模式 访问controller的路径时 发现后台已经传送出去json数据 64 RequestMappin
  • Ubuntu虚拟机反复在登录界面循环问题

    登录Ubuntu的时候发现登录界面不对劲 xff0c 之前从来没有看到过 而且无法登录 xff0c 反复在登录界面循环 百度 xff0c 说原因有两个 xff1a 1 环境变量修改有问题 xff1b 2 显卡驱动有问题 xff1b 均尝试数
  • pycharm设置笔记

    目录 区分级别显示高亮日志 区分级别显示高亮日志 效果 设置log highlighting里填入 s E RROR s 即可 s E RROR s
  • Ubuntu设置开机自启动

    文章目录 前言一 基本概念二 操作步骤1 终端输入2 设置路径 总结 前言 本文介绍如何在Ubuntu设置开机自启动 一 基本概念 除了系统上配置的默认启动应用程序之外 xff0c gnome session properties 程序使用
  • uniapp 发布网站遇到的问题(跨域,nginx代理失败,index无法打开,手机端无法访问等)

    跨域 如果开发的应用直接是作为手机APP是不存在跨域问题的 xff0c 但是如果是网站形式就要考虑这个问题了 分为两点 xff1a 1 调试时 可通过设置maintest 2 发布后 可通过Nginx配置文件设置代理 nginx代理失败 1
  • 怎么在linux上安装vnc

    1 首先检查是否安装了VNC服务 输入命令 xff1a rpm qa grep vnc 2 安装VNC xff0c 首次执行vncserver需要设置密码 xff0c 可以创建多个桌面 xff0c 执行多次vncserver命令即可 roo
  • VNC修改端口号

    1 vnc的默认端口是自己配置的 xff0c 想要修改vncserver的配置 xff0c 需要先找配置文件路径 root 64 node04 which vncserver usr bin vncserver 2 通过查找以前配置的端口
  • onNewIntent使用遇到的坑

    onCreate是用来创建一个Activity也就是创建一个窗体 xff0c 但一个Activty处于任务栈的顶端 xff0c 若再次调用startActivity去创建它 xff0c 则不会再次创建 若你想利用已有的Acivity去处理别
  • CentOS7使用firewall-cmd打开关闭防火墙与端口

    一 centos7版本对防火墙进行加强 不再使用原来的iptables 启用firewalld 1 firewalld的基本使用 启动 xff1a systemctl start firewalld 查状态 xff1a systemctl
  • 算法数学基础-排列组合(题目取自牛客网)

    基础理论 xff1a 排列 有限集的子集按某种条件的序化法排成列 排成一圈 不许重复或许重复等 从n个不同元素中每次取出m xff08 1 m n xff09 个不同元素 xff0c 排成一列 xff0c 称为从n个元素中取出m个元素的无重