当前位置: 首页 > news >正文

排列组合总结

排列组合

一、定义

1. 排列

定义

n n n 个不同元素中,取出 m m m 个元素并对其进行排序的情况数为排列数,记作 A n m A^m_n Anm

计算

对于第 1 个元素,有 n n n 种选择,对于第 2 个元素,由于第一个元素已经占了一位,则有 n − 1 n - 1 n1 种选择,以此类推,则第 n n n 个元素,有 n − m + 1 n - m + 1 nm+1 中选择;

所以有, A n m = n ∗ ( n − 1 ) ∗ . . . ∗ ( n − m + 1 ) = n ! ( n − m ) ! A^m_n = n * (n - 1) * ... * (n - m + 1) = \frac{n!}{(n - m)!} Anm=n(n1)...(nm+1)=(nm)!n!

2. 组合

定义

n n n 个不同元素中,取出 m m m 个元素不考虑顺序的情况数为排列数,记作 C n m C^m_n Cnm ( m n ) \binom{m}{n} (nm)

计算

则在选出 m m m 个元素考虑排序的基础上去除掉因相同数字不同顺序的情况,即 m m m 个元素的全排列数量即可;

所以有, C n m = A n m m ! = n ! m ! ( n − m ) ! C^m_n = \frac{A^m_n}{m!} = \frac{n!}{m!(n - m)!} Cnm=m!Anm=m!(nm)!n!

由于从 n n n 个元素中,取出 m m m 个元素不考虑顺序等同于从 n n n 个元素中,保留 n − m n - m nm 个元素不考虑顺序;

所以有, C n m = C m n − m C^m_n = C^{n - m}_m Cnm=Cmnm

二、小球与盒子模型

在此模型中,共有 3 个关键要素,即球 (元素) ,盒 (容器) 与是否允许空盒,最终求放的不同情况数,相同的球或盒意为不用考虑相同方法的不同排列情况,不同的球或盒反之;

n n n 个球, m m m 个盒子为例;

1. 球相同,盒不同,不空盒

由于要求没有空的盒子,则可想象为 n n n 个小球被 m − 1 m - 1 m1 个隔板分为 m m m 段,将每段放入一个盒子里,即在 n − 1 n - 1 n1 个空隙中选择 m − 1 m - 1 m1 个空放隔板;

答案即为 C n − 1 m − 1 C^{m - 1}_{n - 1} Cn1m1

2. 球相同,盒不同,可空盒

即为可使用 m m m 个虚拟球先放入每个箱子里,则即转化为种类 1 的情况,即在 n + m − 1 n + m - 1 n+m1 个球的空隙中选择 m − 1 m - 1 m1 个空放隔板;

答案即为 C n + m − 1 m − 1 C^{m - 1}_{n + m - 1} Cn+m1m1

3. 球不同,盒相同,不空盒

由于球不相同,则不能使用排列组合解决;

则即为将 n n n 个球分成 m m m 个非空集合的方案数量,则考虑 DP ;

状态

d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 i i i 个球 j j j 个盒的不同情况数;

初始化

d p [ 0 ] [ 0 ] = 1 dp[0][0] = 1 dp[0][0]=1

转移

则对于每一个新放的球 i i i 可分情况讨论,

  1. 若原 i − 1 i - 1 i1 个球放入了 j − 1 j - 1 j1 个盒子中,则对于第 i i i 个球,由于不能空盒,则直接放入 j j j 盒子中,即有 d p [ i − 1 ] [ j − 1 ] dp[i - 1][j - 1] dp[i1][j1] 情况;

  2. 若原 i − 1 i - 1 i1 个球放入了 j j j 个盒子中,则对于第 i i i 个球,可放入前 j j j 个盒子中的任意 1 个,即有 d p [ i − 1 ] [ j ] ∗ j dp[i - 1][j] * j dp[i1][j]j 种情况;

将两种情况数量相加即可;

则有状态转移方程,

d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + d p [ i − 1 ] [ j ] ∗ j dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] * j dp[i][j]=dp[i1][j1]+dp[i1][j]j

最终总方案数量则为 d p [ n ] [ m ] dp[n][m] dp[n][m]

4. 球不同,盒相同,可空盒

可空盒的情况即为将 n n n 个球放在 1 , 2 , 3 , . . . , m 1, 2, 3, ... , m 1,2,3,...,m 个箱子里的情况数的总和;

答案即为 ∑ i = 1 m d p [ n ] [ i ] \sum_{i = 1}^{m}dp[n][i] i=1mdp[n][i]

5. 球不同,盒不同,不空盒

则可在球相同的情况的基础上将球进行全排列后放入盒子;

答案即为 d p [ n ] [ m ] ∗ m ! dp[n][m] * m! dp[n][m]m!

6. 球不同,盒不同,可空盒

则对于每一个球均有 m m m 个盒子选择;

答案即为 m n m^n mn

7. 球相同,盒相同,不空盒

由于球与盒均相同,则不能使用排列组合解决,考虑 DP ;

状态

d p [ i ] [ j ] dp[i][j] dp[i][j] 表示 i i i 个球 j j j 个盒的不同情况数;

初始化

使用循环赋初值即可;

  1. i == j 时,即每个盒子放一个球,则只有一种放法,则 d p [ i ] [ i ] = 1 dp[i][i] = 1 dp[i][i]=1

  2. j == 1 时,即只有一个盒子,则只有一种放法,则 d p [ i ] [ 1 ] = 1 dp[i][1] = 1 dp[i][1]=1

转移

由于不能空盒,所以对于 d p [ i ] [ j ] dp[i][j] dp[i][j] 应先用 j j j 个球使盒子不为空,则对于原来的 i − j i - j ij 个球可放到 1 , 2 , . . . , j 1, 2, ..., j 1,2,...,j 个箱子里;

则有状态转移方程,

d p [ i ] [ j ] = ∑ k = 1 j d p [ i − j ] [ k ] dp[i][j] = \sum_{k = 1}^{j}dp[i - j][k] dp[i][j]=k=1jdp[ij][k]

注意 i , j i, j i,j 的范围, i ∈ [ 1 , n ] , j ∈ [ 2 , i ] i \in [1, n], j \in [2, i] i[1,n],j[2,i]

答案则为 d p [ n ] [ m ] dp[n][m] dp[n][m]

8. 球相同,盒相同,可空盒

则可先用 m m m 个球使盒子不为空,则对于剩下的 n − m n - m nm 个球可做情况 8 处理;

答案即为 d p [ n − m ] [ n ] dp[n - m][n] dp[nm][n]

相关文章:

  • IIC协议详解
  • javaIO流05:FileReader和Filewriter
  • 【PTHREAD】线程创建
  • s19.基于 Kubernetes v1.25.0(kubeadm) 和 Docker 部署高可用集群(一)
  • 力扣记录:Hot100(4)——75-101
  • 数据结构之——OJ题环形队列实现详解
  • 基于樽海鞘群算法的线性规划求解matlab程序
  • qt自定义控件之TextEdit
  • 深度估计 双目深度估计+单目深度估计 ONNX运行程序
  • Express 路由
  • 2022蓝帽杯初赛电子取证
  • 数据结构与算法复习:第三十六弹
  • CSS - 响应式布局(一)媒体查询
  • 【JAVA预备】课程目录
  • 2022年0902Maven的依赖学习<第四课>
  • Google 是如何开发 Web 框架的
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • android 一些 utils
  • GitUp, 你不可错过的秀外慧中的git工具
  • k个最大的数及变种小结
  • mysql_config not found
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • PAT A1050
  • python3 使用 asyncio 代替线程
  • Python利用正则抓取网页内容保存到本地
  • spring security oauth2 password授权模式
  • V4L2视频输入框架概述
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 赢得Docker挑战最佳实践
  • 用 Swift 编写面向协议的视图
  • 中文输入法与React文本输入框的问题与解决方案
  • 字符串匹配基础上
  • hi-nginx-1.3.4编译安装
  • #mysql 8.0 踩坑日记
  • (0)Nginx 功能特性
  • (06)Hive——正则表达式
  • (2.2w字)前端单元测试之Jest详解篇
  • (C语言)球球大作战
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (第二周)效能测试
  • (十八)SpringBoot之发送QQ邮件
  • (数据结构)顺序表的定义
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)shell调试方法
  • (转)VC++中ondraw在什么时候调用的
  • (转)使用VMware vSphere标准交换机设置网络连接
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • @Autowired注解的实现原理
  • @ModelAttribute 注解
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)