一般的排列组合场景都可以抽象为「把球放入盒子」的问题。根据场景不同,球或盒子有以下性质:

  • 球和球之间是否相同。
  • 盒与盒之间是否相同。
  • 放完之后,是否允许有空盒子。

组合以上性质,共有八种场景。

是否相同可以理解为是否考虑排列。比如,把六个球放入两个盒子里面,每个盒子各三个。

当球相同,盒相同时,显然只有一种方法(限制了每个盒子放三个)。

当球不同,盒相同时,显然有多种方法,比如:

当球不同,盒不同时,显然也有多种方法,比如:

当球相同,盒不同时,显然也只有一种方法(限制了每个盒子放三个):

但是当一个盒子放四个,另一个盒子放两个时,有两种方案:

为了描述方便,我们设球的数量为 n ( n ≥ 1 n \ge 1 n≥1),盒子的数量为 m ( m ≥ 1 m \ge 1 m≥1)。

情形一:球相同,盒相同,允许有空盒。

f ( n , m ) = { 1 , n ≤ 1 o r m = 1 f ( n , n ) , n < m f ( n , m − 1 ) + f ( n − m , m ) , n ≥ m f(n,m) = \left\{ \begin{array}{l} 1&, n \le 1\ or\ m = 1 \\ f(n, n)&,n \lt m \\ f(n, m-1) + f(n-m,m)&, n \ge m \\ \end{array}\right. f(n,m)=⎩⎨⎧​1f(n,n)f(n,m−1)+f(n−m,m)​,n≤1 or m=1,n<m,n≥m​

当 n ≤ 1 o r m = 1 n \le 1\ or\ m = 1 n≤1 or m=1 时,这是递归的边界:「仅有一个球或没有球」或者「仅有一个盒子」,显然只有一种方法。

当 n < m n \lt m n<m 时,至少有 m − n m-n m−n 个盒子是空的,那就先把这些盒子丢弃吧。

当 n ≥ m n \ge m n≥m 时,有两种策略:

  • 丢掉一个盒子(注意,这个盒子可能在之前的步骤放过球了)。
  • 每个盒子放一个球。

情形二:球相同,盒相同,无空盒。

可以基于「情形一」推演出来。先向每个盒子放一个球,保证无空盒,然后就变成了情形一。因此有:
f ( n , m ) = { 0 , n < m f 情 形 一 ( n − m , m ) , n ≥ m f(n,m) = \left\{ \begin{array}{l} 0&, n < m \\ f_{情形一}(n-m, m)&,n \ge m \\ \end{array}\right. f(n,m)={0f情形一​(n−m,m)​,n<m,n≥m​

情形三:球相同,盒不同,无空盒。

插板法: n n n 个球依次排成一行,有 n − 1 n-1 n−1 个缝隙。有 m − 1 m-1 m−1 个隔板,将球分成 m m m 份。相当于从 n − 1 n-1 n−1 个缝隙中挑选出 m − 1 m-1 m−1 个放置隔板。因此:
f ( n , m ) = C n − 1 m − 1 f(n,m) = C_{n-1}^{m-1} f(n,m)=Cn−1m−1​

情形四:球相同,盒不同,允许有空盒。

等价于 n + m n+m n+m 个球放入 m m m 个盒子,不允许空。可以理解为:预先向 m m m 个盒子各放入了一个球。因此有:
f ( n , m ) = C n + m − 1 m − 1 f(n,m) = C_{n+m-1}^{m-1} f(n,m)=Cn+m−1m−1​

情形五:球不同,盒相同,无空盒。

f ( n , m ) = { 0 , n < m 1 , n = m m ∗ f ( n − 1 , m ) + f ( n − 1 , m − 1 ) , n > m f(n,m) = \left\{ \begin{array}{l} 0&,n \lt m \\ 1&,n = m \\ m*f(n-1,m) + f(n-1, m-1)&, n \gt m \end{array}\right. f(n,m)=⎩⎨⎧​01m∗f(n−1,m)+f(n−1,m−1)​,n<m,n=m,n>m​

解释一下:

  • 当 n < m n\lt m n<m 时,必然会有空盒子,因此为 0 0 0。
  • 当 n = m n = m n=m 时,每个盒子只能放一个,且盒子相同,所以只有 1 1 1 中。
  • 当 n > m n \gt m n>m 时:
    • 如果前 n − 1 n-1 n−1 个球放入了 m m m 个盒子,则第 n n n 个球,有 m m m 种放法;
    • 如果前 n − 1 n-1 n−1 个球放入了 m − 1 m-1 m−1 个盒子,则第 n n n 个球只能放入剩余的空盒,因此只有 1 1 1 种。
    • 如果前 n − 1 n-1 n−1 个球放入了 m − 2 m-2 m−2 或更少的盒子,则第 n n n 个球无论咋放都会有空盒,因此为 0 0 0 种。

情形六:球不同,盒相同,允许有空盒。

将该问题拆分为 m m m 个子问题,每个子问题都变为了情形五。
f ( n , m ) = ∑ i = 1 m f 情 形 五 ( n , i ) f(n,m) = \sum_{i=1}^{m}{f_{情形五}(n,i)} f(n,m)=i=1∑m​f情形五​(n,i)

情形七:球不同,盒不同,允许有空盒。

一共 n n n 个球,每个球都有 m m m 种放法,总共有 n m n^m nm。

情形八:球不同,盒不同,无空盒。

基于情形五计算。情形五中盒子是相同的,因此只需再乘上盒子的排列即可。答案为:
f ( n , m ) = f 情 形 五 ( n , m ) ∗ m ! f(n,m) = f_{情形五}{(n,m)}*m! f(n,m)=f情形五​(n,m)∗m!

参考文章

https://blog.csdn.net/qwb492859377/article/details/50654627

排列组合中的八种球盒模型相关推荐

  1. 聊聊 Linux 中的五种 IO 模型

    聊聊 Linux 中的五种 IO 模型 2016/04/21 · IT技术 · 8 评论 · iO, 同步, 异步, 阻塞, 非阻塞 分享到:0 本文作者: 伯乐在线 - 陶邦仁 .未经作者许可,禁止 ...

  2. 约数个数 (排列组合中的乘法原理)

    问题 A: 约数个数 时间限制: 2 Sec  内存限制: 128 MB 提交: 313  解决: 39 提交 状态 讨论版 命题人:admin 题目描述 p^q表示p的q次方,正整数M可以分解为M= ...

  3. 团队中的八种角色及启示

    首先事先声明:这篇博文是听了王树文老师的项目管理微课程后自己整理的笔记,仅供学习使用. 一. 团队中的八种角色 从上图可以看出在一个团队中,一般地会存在八种角色,他们分别是:实干者,协调者,推进者,创 ...

  4. 【数论】 排列组合中的隔板问题

    排列组合中的可以一个空插多个隔板的问题 但是现在要解决的情况是盒子可以分不到球.这样我们通过一步化归,转换为上面的情况:添加 nn 个球,使每个盒子至少有一个球.这样分完后只要将每个盒子多拿的一个球收 ...

  5. JAVA中的八种基本类型

    一.JAVA中的八种基本类型 1.数字类型(6种)   ①byte:     占的位数:byte数据类型占八位: 最小值为:-128(-2^7): 最大值为:127(2^7-1): 默认值为:0: 作 ...

  6. 什么时候用到全排列_请问在排列组合中,在什么情况下要乘以全排列

    展开全部 在比考虑每个事件出现的次序时,这种次序不同影响了结果,则需用全排列,在排列组合636f707962616964757a686964616f31333433633961中,均分问题要除以全排列 ...

  7. 排列组合中关于捆绑法、插空法、插隔板法

    捆绑法:当要求某几个元素必须相邻(挨着)时,先将这几个元素看做一个整体,(比如:原来3个元素,整体考虑之后看成1个元素)然后将这个整体和其它元素进行考虑.这时要注意:一般整体内部各元素如果在前后顺序上 ...

  8. Java中的八种基本数据类型

    Java中主要有八种基本数据类型:byte.short.int.long.float.double.boolean.char. 各种数据类型作用: 1.byte: 8位.有符号的以二进制补码表示的整数 ...

  9. Java中的八种包装类

    文章目录 为什么需要包装类? Java提供的八种包装类 装箱和拆箱 整数型常量池 Integer中的常用方法 int .Integer.String之间的相互转换 为什么需要包装类? 读以下程序: p ...

最新文章

  1. 【matlab】第二章基本使用方法
  2. 学习Html之后总结的超全的思维导图!
  3. 请说明一下Spring中BeanFactory和ApplicationContext的区别是什么?
  4. linux退出 putty_linux – 在一个命令中退出所有SSH连接并关闭PuTTY
  5. .Net Crank性能测试入门
  6. .Net Core及.Net Standard主要概念回顾
  7. 背后的故事之 - 快乐的Lambda表达式(二)
  8. mysql souece 慢_Mysql InnoDB在linux下用source命令执行sql脚本速度慢的问题解决
  9. 畅通工程(kruskal算法)
  10. 智慧交通前瞻:如何解决城市发展“心病”?
  11. 一字之差——手机中的“拼”音输入法和“注”音输入法
  12. Mac 环境下labelImg标注工具的安装
  13. turtle库画一个正方形
  14. 20220422web前端面试记录
  15. centos8代理上网_centos设置代理上网
  16. EasyUi 快速入门
  17. error: dst ref refs/heads/master receives from more than one src
  18. 无线渗透之KALI基础
  19. 用艺术的陪伴赋能心智障碍群体
  20. java开发去国企和私企,看完跪了

热门文章

  1. 【Flutter web】内网网站如何发布?解决外网下canvaskit.js和字体无法加载问题
  2. 微微网络电话解救月光族 不当职场“囧”人
  3. win7安装ettercap_使用ettercap进行dns欺骗和获取目标浏览的图片
  4. postgresql影子用户实践
  5. 【Win10】Java开发环境搭建新手教程(图文)
  6. 大疆A3飞控使用|飞控配置
  7. 如何部署建筑行业数据备份与恢复方案?
  8. Ansys仿真TDR
  9. python i18n 国际化简单实现-easy_i18n
  10. Cobbler——自动装机(内含详细操作过程)