排列组合详解

2023-05-16

在笔试题中看到的一个选择题

用1*3的瓷砖密铺3*20的地板有几种方式?

排列组合问题

排列和组合问题,其实是两种问题,区分它们的原则是是否需要考虑顺序的不同。排列问题,考虑顺序;组合问题,不考虑顺序。以下4个问题,哪个是排列,哪个是组合?

Q1: 一套书共有1-6 册,从书架上把它们全部取下。有多少种取法?
Q2: 有5个红球,3个黄球,2个黑球,从中选择2个球。有多少种不同的选择?
Q3: 10个候选人,选3个作为领队,有多少种选择方案?
Q4: 有一把3位数字密码锁,最多需要试多少次才能打开?

以上4个问题,1和4属于排列问题,2和3是组合问题。取书问题中,{1, 2, 3, 4, 5, 6}和{1, 6, 5, 4, 3, 2},两种方法顺序不同,属于不同的取法,即要考虑顺序不同的排列问题。选球问题中,第1次选黄第2次选黑,和第1次选黑第2次选黄,是相同的选择,即不同考虑顺序不同的组合问题。

此外,考虑是否重复又可分为排列可重复问题、排列不可重复问题、组合可重复问题、组合不可重复问题。例如Q4,{1, 2, 1}是一种密码,数字是可重复的。Q1,取书问题,就无法同一册书取两次,是不可重复的。

排列可重复

那么,何为“可重复”呢?暂且不考虑排列组合,先解释可重复。举个例子,冰淇淋有3种口味可以选择,我可以选择3种相同口味,也可以选择不同口味,每次选择即可相同也可不相同。再举个例子抛硬币3次,很显然,可能会出现3次都是正面,硬币出现正反面是可重复的。典型的问题如,开锁问题,彩票问题,都是排列可重复问题。

排列可重复问题公式如下,每次 n n 种选择,选择r次的排列共有:

nr n r
这很好理解,一次有 n n 种选择,第二次有nn种选择,……,第 r r 次有nr种选择。

排列不可重复

不可重复也很好理解了。例如,打桌球问题,一共15个球,打进所有球有多少种打法。这种情况下,不可能一个球重复打进,第一次击球有15种可能,第二次只有14种,……,最后一次就只有一个球了,只有一种可能。

这个打桌球问题,可以这样理解。首先,共有15个球,全部打完,共有多少种排列?显然, 1514...21=15! 15 ∗ 14 ∗ . . . ∗ 2 ∗ 1 = 15 ! 。然后考虑,不全部打完呢?打3次有多少种排列,显然 151413 15 ∗ 14 ∗ 13 ,为了公式的整齐可以写成

1514131211...1211109...=15!12!=15!(153)! 15 ∗ 14 ∗ 13 ∗ 12 ∗ 11... 12 ∗ 11 ∗ 10 ∗ 9 ∗ . . . = 15 ! 12 ! = 15 ! ( 15 − 3 ) !
排列不可重复问题更一般的公式如下, n n 个球,打r次的排列共有:
n!(nr)! n ! ( n − r ) !

组合不可重复

组合可重复问题放在最后,先看组合不可重复。先看例子,共有红黄蓝绿黑5种颜色的球,随机取3次有几种颜色组合。{红、绿、黄}和{黄、绿、红}虽然顺序不同,但是相同的组合,即只算一种情况。同时,不可能出现{红、红、黄},即这是一个不可重复问题。

首先,显然红黄绿是1种组合,我们来看红黄绿有多少种排列。

排列组合
红,黄,绿红、黄、绿
红,绿,黄
黄,绿,红
黄,红,绿
绿,红,黄
绿,黄,红

321=3! 3 ∗ 2 ∗ 1 = 3 ! 种排列,是同1种组合。所以本问题中,首先根据排列不重复问题,我们求出所有的排列 5!(53)! 5 ! ( 5 − 3 ) ! ,再除以 3! 3 ! 就是我们需要的组合数了。

组合不重复问题的公式为:

n!(nr)!1r! n ! ( n − r ) ! ∗ 1 r !

组合可重复

举个例子,有5种冰淇淋口味{咖啡,香草,草莓,香蕉,香芋},选3次,口味可重复,共有多少种组合。口味分别用字母{C, V, S, B, T}代替,用走方格来简化, 表示选择当前字符, > > 表示移动到下一格。

C V S B T

选择{C, B, B},可以记作>>>>
选择{V, S, T},可以记作 >>>> > ◯ > ◯ >> ◯
选择{T, C, T},由于顺序不重要,所以等于{C, T, T}可以记作 >>>> ◯ >>>> ◯ ◯
所以,将问题转化为从头开始走方格到最后一格, > > 的组合问题。不论怎么选择,移动到最后一格都需要5-1=4步,加上选择的3步,所以共有(5-1)+3=7种可能,其中3个圆圈,共有7!(73)!3!。可以转化成组合不重复问题,看作共有(r+n-1)个球,从中选择(r)个,即 (r+n1)!r!(r+n1r)! ( r + n − 1 ) ! r ! ∗ ( r + n − 1 − r ) !
组合可重复的公式为:

(r+n1)!r!(n1)! ( r + n − 1 ) ! r ! ∗ ( n − 1 ) !

所以解题的关键在于如何将问题转化为我们熟悉的排列组合问题。下面我们再来看一个例子,如何将问题转化。

例:3个红球和3个白球,全排列有多少种?
这个问题就是一个排序可重复问题。先把3白球放好,红球插到白球之中。
这里写图片描述
将问题转化为4个位置,插入3个球问题。变化成走方格问题。

1234

如果选择{1,2,2}, >>> ◯ > ◯ ◯ >> 则代表了在位置1插入1个红球,在位置2插入2个红球,即6个球的组合为{红,白,红,红,白,白};

如果选择{2,2,2}, >>> > ◯ ◯ ◯ >> 则代表在位置2插入3个红球,6个球的位置即为{白,红,红,红,白,白}。
所以,n=4,r=3按照公式 (4+31)!3!(41)!=20 ( 4 + 3 − 1 ) ! 3 ! ∗ ( 4 − 1 ) ! = 20


所以回到一开始的题目。应该怎么算呢?

待续


参考文献:
https://www.mathsisfun.com/combinatorics/combinations-permutations.html

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

排列组合详解 的相关文章

随机推荐

  • 小米电视访问电脑共享文件夹

    输入win 43 R打开运行窗口 输入control进入控制面板 点击 网络和internet 网络共享中心 更改高级共享设置 a 专用 网络设置如图 xff1a b 来宾或公用 网络设置如图 xff1a c 所有网络 设置如图 xff1a
  • 让Everything搜索结果更清爽

    Everything的文件搜索功能很强大 xff0c 但是默认设置下搜索出的结果过于丰富 xff0c 总是会有一些乱七八糟的后缀名文件 xff08 如下图 xff09 xff0c 或许我们并不想搜索出那些文件 这时我们需要对它设置里的排除列
  • 上机 Qt5.14.2 编程应用

    上机 Qt5 14 2 编程应用 关于QT Qt是一个1991年由Qt Company开发的跨平台C 43 43 图形用户界面应用程序开发框架 它既可以开发GUI程序 xff0c 也可用于开发非GUI程序 xff0c 比如控制台工具和服务器
  • Android Studio报错:Error:Could not find com.android.tools.build:gradle:4.1 记一次不长记性的坑

    本文地址 xff1a https blog csdn net zengsidou article details 79797417 看字面意思 xff0c 这个问题是Gradle没有对应版本 在搜索引擎没有找到方法之后 xff0c 尝试自己
  • VBox关闭dhcp

    VBox关闭dhcp C Program Files Oracle VirtualBox gt VBoxManage exe list dhcpservers NetworkName HostInterfaceNetworking Virt
  • Android 使用LottieAnimationView 做启动动画

    lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt RelativeLayout xmlns android 61 34 http schemas android com ap
  • Android OkHttp★

    1 OkHttp OkHttp是Square公司开发的一个处理网络请求的开源项目 是目前Android使用最广泛的网络框架 OkHttp的特点 支持HTTP 2并允许对同一主机的所有请求共享一个socket连接 如果非HTTP 2 则通过连
  • Android GestureDetector★★★

    1 GestureDetecor 用户触摸屏幕时会产生许多手势 xff0c 一般通过重写View类的onTouch 方法可以处理一些触摸事件 xff0c 但是这个方法太过简单 xff0c 如果需要处理一些复杂的手势 xff0c 用这个接口就
  • Android canvas

    1 Canvas Canvas指画布 xff0c 表现在屏幕上就是一块区域 xff0c 可以在上面使用各种API绘制想要的东西 canvas内部维持了一个mutable Bitmap xff0c 所以它可以使用颜色值去填充整个Bitmap
  • Android apk打包流程★

    1 apk打包 Android开发中打包apk主要有两种方式 使用Android Studio集成直接生成apk 使用ant工具在命令行方式下打包apk 不管哪种方式 打包apk的本质过程都是一样的 Android的apk包文件包括两部分
  • Android ViewPager用法

    1 适配器PagerAdapter ViewPager使用适配器类将数据和view的处理分离 xff0c ViewPager的适配器叫PagerAdapter xff0c 这是一个抽象类 xff0c 不能实例化 xff0c 所以它有两个子类
  • Android Fragment★★

    1 Fragment fragment译为 碎片 xff0c 是Android 3 0 xff08 API 11 xff09 提出的 xff0c 最开始是为了适配大屏的平板 Fragment看起来和Activity一样 xff0c 是一个用
  • Android设计模式—适配器模式★★★

    1 适配器模式 适配器模式是指把一个类的接口变换成客户端所期待的另一种接口 xff0c 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 适配器模式是为了解决接口不兼容问题的 比如厂商给你的接口和你现有的接口对接不起来 旧的数据
  • Android 类加载机制

    nbsp 1 类加载机制 java文件不是可执行的文件 需要先编译成 class文件才可以被虚拟机执行 而类加载就是指通过类加载器把 class文件加载到虚拟机的内存空间 具体来说是方法区 类通常是按需加载 即第一次使用该类时才加载 Jav
  • Android Bitmap防止内存溢出

    1 Bitmap 在Android开发中经常会使用到Bitmap xff0c 而Bitmap使用不当很容易引发OOM Bitmap占用内存大小的计算公式为 xff1a 图片宽度 图片高度 一个像素点所占字节数 xff0c 因此减小这三个参数
  • Swift NSAttributedString的使用

    NSMutableAttributedString let testAttributes 61 NSAttributedStringKey foregroundColor UIColor blue NSAttributedStringKey
  • Android ViewStub

    1 ViewStub ViewStub是一个可用于性能优化的控件 xff0c 它是一个不可见的 零尺寸的View xff0c 可以在运行时进行延迟加载一个布局文件 xff0c 从而提高显示速率 viewstub和include比较像 xff
  • Android Jetpack—LiveData和数据倒灌

    1 LiveData LiveData是Android Jetpack包提供的一种可观察的数据存储器类 xff0c 它可以通过添加观察者被其他组件观察其变更 不同于普通的观察者 xff0c LiveData最重要的特征是它具有生命周期感知能
  • Gradle build 报错:Received status code 400 from server: Bad Request

    全部错误是这样的 xff1a Could not GET 39 https dl google com dl android maven2 com android tools build gradle 3 1 2 gradle 3 1 2
  • 排列组合详解

    在笔试题中看到的一个选择题 用1 3的瓷砖密铺3 20的地板有几种方式 xff1f 排列组合问题 排列和组合问题 xff0c 其实是两种问题 xff0c 区分它们的原则是是否需要考虑顺序的不同 排列问题 xff0c 考虑顺序 xff1b 组