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

本文所属分类

组合数学汇总

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) = mn

不容许盒子为空

所有情况(总方案数): mn

至少一个空盒子的情况: 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

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

总方案数- 有空盒子的方案数= mn + ∑ i : 1 m \sum_{i:1}^{m} ∑i:1mg(i) = (-1)0C 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. 统计理想数组的数目
相关推荐
.YM.Z14 小时前
【数据结构】:排序(一)
数据结构·算法·排序算法
Chat_zhanggong34514 小时前
K4A8G165WC-BITD产品推荐
人工智能·嵌入式硬件·算法
百***480715 小时前
【Golang】slice切片
开发语言·算法·golang
墨染点香15 小时前
LeetCode 刷题【172. 阶乘后的零】
算法·leetcode·职场和发展
做怪小疯子15 小时前
LeetCode 热题 100——链表——反转链表
算法·leetcode·链表
郝学胜-神的一滴15 小时前
Linux命名管道:创建与原理详解
linux·运维·服务器·开发语言·c++·程序人生·个人开发
晚风(●•σ )16 小时前
C++语言程序设计——11 C语言风格输入/输出函数
c语言·开发语言·c++
恒者走天下17 小时前
秋招落定,拿到满意的offer,怎么提高自己实际的开发能力,更好的融入团队
c++
做怪小疯子17 小时前
LeetCode 热题 100——矩阵——旋转图像
算法·leetcode·矩阵
努力学习的小廉17 小时前
我爱学算法之—— BFS之最短路径问题
算法·宽度优先