【组合数学 隔板法 容斥原理】放球问题

本文所属分类

组合数学汇总

8类放球问题

放球问题是一类很有意思的排列组合问题。通俗来说,就是把n个小球放到m个盒子里,问有几种放法。具体可以从3个维度,每个维度2种情况,共8种情况:

维度一:小球是否相同。

维度二: 盒子是否相同。

维度三: 是否容许盒子为空。

一,球相同,盒不同

隔板法: 球一字排开,用m-1个隔板隔开。

容许盒子为空

m-1个隔板。第一个隔板有n+1 个位置放,第二个隔板n+1+1个位置放 ⋯ \cdots ⋯。(n+1) × \times ×(n+2) ⋯ \cdots ⋯(n+m-1) 就是排列 P n + m − 1 m − 1 _{n+m-1}^{m-1} n+m−1m−1 由于不关心隔板的顺序。故是

故是:C n + m − 1 m − 1 _{n+m-1}^{m-1} n+m−1m−1

不容许盒子为空

m-1个隔板,每个隔板有n-1个位可以放。由于不能为空,所有两个隔板不能放到同一个位置,球的左右边缘也不能放隔板。从n-1位置选择m-1个隔板,故:C n − 1 m − 1 _{n-1}^{m-1} n−1m−1

二,球相同,盒相同

令 cnt[i]记录第i个盒子放的球数,由于球、盒子都相同。如果排序后cnt1和cnt2相同,则是同一种方案。为了避免重复,我们只枚举cnt按升序排序的方案。

容许盒子为空

如果 n < m,前面m-n个盒子一定为空,后面的n个盒子可能空,也可能非空。故f(n,m) = f(n,n)情况一

如果 n >= m,如果第一个盒为空则:f(n,m) = f(n,m-1) 情况二 ;如果第一个盒子不为空,所有盒子都必须放一i个球:则f(n,m) = f(n-m,m)情况三

当m等于1是,只有一个盒子,只能把所有球,全部放到一个盒子中。故 f(?,1) =1 。

当n为0时,所有盒子都为空。故 f(0,?) =1 。

三种情况,至少n或m减少,故一定会让 n <= 0或m <=1。

那会不会 n 没有变成0,直接变成负数?

只有情况三会让n减少 ,情况三的前提是 n >= m,故n的新值n-m必定大于等于0。

m不会在变成1之前,变成0或负数。

情况一: m= n,由于函数未提前结束,说名n > 0。故m也大于0。

情况二:函数未结束,说明m >1,故m-1 >=1。

总结:
f ( n , m ) = { 1 ( 0 = = n ) 或 ( 1 = = m ) f ( n , n ) n < m f ( n , m − 1 ) + f ( n − m , m ) o t h e r f(n,m)=\begin{cases}1 && (0==n)或(1==m)\\ f(n,n) && n < m \\ f(n,m-1)+ f(n-m,m) && other \\ \end{cases} f(n,m)=⎩ ⎨ ⎧1f(n,n)f(n,m−1)+f(n−m,m)(0==n)或(1==m)n<mother

不容许盒子为空

每个盒子放一个球,就变成容许为空。
g ( x ) = { 0 n < m f ( n − m , m ) o t h e r g(x)=\begin{cases} 0 && n < m \\ f(n-m,m) && other\\ \end{cases} g(x)={0f(n−m,m)n<mother

三,球不同,盒不同

容许盒子为空

每个球都有m个盒子可以放,不会重复。故f(n,m) = m^n^

不容许盒子为空

所有情况(总方案数): m^n^

至少一个空盒子的情况: C m 1 _{m}^{1} m1(m-1)^n^

至少两个空盒子的情况:C m 2 _{m}^{2} m2(m-2)^n^
⋮ \vdots ⋮

至少m-1个盒子的情况:C m m − 1 _{m}^{m-1} mm−1(m-(m-1))^n^

令f(i) = ( − 1 ) i + 1 C m i ( m − i ) n (-1)^{i+1}C_m^i(m-i)^n (−1)i+1Cmi(m−i)n

根据容斥原理,有空盒子不重复的方案数为:
∑ i : 1 m − 1 \sum_{i:1}^{m-1} ∑i:1m−1f(i) ,f(m)=0,故: ∑ i : 1 m − 1 \sum_{i:1}^{m-1} ∑i:1m−1f(i) 就是 ∑ i : 1 m \sum_{i:1}^{m} ∑i:1mf(i)

令 g(i) = -f(i) = ( − 1 ) i C m i ( m − i ) n (-1)^iC_m^i(m-i)^n (−1)iCmi(m−i)n

不包括空盒子的方案数为:

总方案数- 有空盒子的方案数= m^n^ + ∑ i : 1 m \sum_{i:1}^{m} ∑i:1mg(i) = (-1)^0^C m 0 m^0 m0(m-i)^n^ + ∑ i : 1 m \sum{i:1}^{m} ∑i:1mg(i) = ∑ i : 0 m \sum_{i:0}^{m} ∑i:0mg(i)

四,球不同,盒相同

不容许盒子为空

球不同盒不同(n,m) = m! × \times × 球不同盒相同(n,m)

m个不同的盒,共有m种不同的顺序,盒相同时,仅顺序不同是相同的。故扣除。

故结果为: 1 m ! \frac 1 {m!} m!1 ∑ i : 0 m \sum_{i:0}^{m} ∑i:0mg(i) 就是第二类斯特林数的通项公式S(n,m)。

容许盒子为空

分类讨论:

0 个空盒子: S(n,m)

1个空盒子: S(n,m-1)
⋮ \vdots ⋮

m-1个空盒子:S(n ,m-(m-1))

累加后: ∑ i : 1 m \sum_{i:1}^m ∑i:1mS(m,i) 可以理解为球实际放在1到m个盒子中。

题解:

似乎不是放球问题 【组合数学 放球问题】1621. 大小为 K 的不重叠线段的数目
球不同盒子相同,不能为空 【放球问题】920. 播放列表的数量
球同盒子不同能为空 【放球问题 乘法原理 唯一分解定理】1735. 生成乘积数组的方案数
球同盒子不同不能为空 【动态规划 组合数学 放球问题】2338. 统计理想数组的数目
相关推荐
网易独家音乐人Mike Zhou2 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
‘’林花谢了春红‘’3 小时前
C++ list (链表)容器
c++·链表·list
机器视觉知识推荐、就业指导5 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Swift社区6 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman7 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年7 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Yang.997 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王7 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_7 小时前
C++自己写类 和 运算符重载函数
c++