分球的八个问题
分球的八个问题
分球的八个问题
问题:把 m 个球放入 n 个盒子里,有多少种放法?
这题目其实条件没说清,m 球放 n 盒,可以有 8 种情况:
- 球同,盒同,盒不可以为空
- 球同,盒同,盒可以为空
- 球同,盒不同,盒不可以为空
- 球同,盒不同,盒可以为空
- 球不同,盒同,盒不可以为空
- 球不同,盒同,盒可以为空
- 球不同,盒不同,盒不可以为空
- 球不同,盒不同,盒可以为空
这 8 个问题,看起来相似,但是解法上是有不同的。我们一个一个看。
问题 8:球不同,盒不同,盒可以为空
最简单的,是问题 8:m 不同球,n 不同盒,允许空盒。
每个球都有 n 种选择,m 个球就有 nmn^mnm 种分法。
S1(m,n)=nmS1(m,n) = n^mS1(m,n)=nm
问题 2:球同,盒同,盒可以为空
问题 2:m 同球,n 同盒,允许空盒。
分情况讨论:
A,球数 (m) 少于盒子数 (n):则分配方案和 m 个球放入 m 个盒子相同。
B,球数 (m) 不少于盒子数 (n):
可以分解为两种情况:
1,至少有一个空盒子。这种情况,与去掉一个空盒子方案数相同。即:mmm 个同球放入 n−1n-1n−1 个同盒子,允许空盒的方案。
2,没有空盒子,所有的盒子都至少放一个球,转化为 m−nm-nm−n 个球放入 nnn 个盒子的方案。
任何一种 mmm 个同球放入 nnn 个同盒的方案必然属于上述两种方案之一,既不会同时属于上述两种方案,也不会出现在这两种方案之外。
S2(m,n)=S2(m,n−1)+S2(m−n,n)S2(m,n) = S2(m, n-1) + S2(m-n,n)S2(m,n)=S2(m,n−1)+S2(m−n,n),如果 m−n<nm-n < nm−n<n,则后一项为 S2(m−n,m−n)S2(m-n, m-n)S2(m−n,m−n)。
罗奕铭的解释:
既然盒相同,我们不妨认为一个分球方案是按照球数的从小到大排列的。
等效成把一个数 m 拆成 n 个数的和,并且这 n 个数单调不降。
设 f(m,n)f(m,n)f(m,n) 为 m 拆成 n 份的方案数。
如果这么拆:x1+x2+x3+...+xn=m(xi≥0)x_1 + x_2 + x_3 + ... + x_n = m \quad (x_i \ge 0)x1+x2+x3+...+xn=m(xi≥0)。
当 x1=0x_1 = 0x1=0 时, x2...xnx_2 ... x_nx2...xn 的拆法可以表示成 f(m,n−1)f(m,n-1)f(m,n−1)。
当 x1≥1x_1 \ge 1x1≥1 时,上式可以变成 (x1−1)+(x2−1)+...+(xm−1)=m−n(x_1 - 1) + (x_2 - 1) + ... + (x_m - 1) = m-n(x1−1)+(x2−1)+...+(xm−1)=m−n。
后面的拆法表示成 f(m−n,n)f(m-n,n)f(m−n,n)。
所以 f(m,n)=f(m,n−1)+f(m−n,n)f(m,n)=f(m,n-1)+f(m-n,n)f(m,n)=f(m,n−1)+f(m−n,n)。
问题 1:球同,盒同,盒不可以空
问题 1:m 同球,n 同盒,无空盒。
既然 m 个球是相同的,而且没有空盒,那从所有方案的每个盒子拿走一个球,方案数不变。
每个盒子拿走一个球,问题 1 转化为 问题 2。
S1(m,n)=S2(m−n,n)S1(m,n) = S2(m-n, n)S1(m,n)=S2(m−n,n)
问题 3:球同,盒不同,盒不可以空
问题 3:m 同球,n 不同盒,无空盒。
这个问题用组合数学插板法解决。
把 mmm 个球排成一排(只有一种方法),它们中间有 m−1m-1m−1 个空挡。从 m−1m-1m−1 个空挡中选择 n−1n-1n−1 个,放入插板。每个空挡最多放一个插板,就把 m 个球分成 n 部分。由于插板不相邻,所以没有空盒。
问题 3 的方法数有 S3(m,n)=Cm−1n−1S3(m,n) = C_{m-1}^{n-1}S3(m,n)=Cm−1n−1 个。
组合数公式:Cnr=Pnrr!=n!r!⋅(n−r)!C_n^r = \frac{P_n^r}{r!} = \frac{n!}{r! \cdot (n-r)!}Cnr=r!Pnr=r!⋅(n−r)!n! ,Pnm=n!(n−m)!P_n^m = \frac{n!}{(n-m)!}Pnm=(n−m)!n!
问题 4:球同,盒不同,盒可以为空
问题 4:m 同球,n 不同盒,允许空盒。
问题 4 可以通过问题 3 求解。
为了避免空盒,先在每一个盒里假装放一个球,这样就有 n+mn+mn+m 个球。按照问题 3 的方法分完了之后,再从每个盒子里面取走一个球,方案数不变。
问题 4 的方法数是:S4(m,n)=S3(m+n,n)=Cn+m−1n−1S4(m,n) = S3(m+n,n) = C_{n+m-1}^{n-1}S4(m,n)=S3(m+n,n)=Cn+m−1n−1。
问题 5、6、7,先熟悉一下这个三角形:

性质1,左右两边都是1,第几行就有几个数,比如第 5 行就是 1 X X X 1。
性质2, S(N,K)=S(N−1,K−1)+K×S(N−1,K)S(N, K) = S(N-1, K-1) + K \times S(N-1, K)S(N,K)=S(N−1,K−1)+K×S(N−1,K),含义是第 NNN 排的第 KKK 个数等于 { 它上一排的左上角位置的数字 } 加 { 它上一排的同样位置数字的 KKK 倍}。
例如 S(7,3)S(7, 3)S(7,3) 就是第 7 排第 3 个数字,所以他等于第 6 排第 2 个数字 加 第 6 排第 3 个数字乘以 3。
所以第 1 排是1,第2排 1,1,第 3 排(左右两边都是1,只有中间那个数字没确定)。 所以 $S(3, 2) = $第 2 排第 1 个数字 加 第 2 排第 2 个数字的两倍 =1+1×2=3= 1+1 \times 2 = 3=1+1×2=3,所以第 3 排数字就是 1,3,1。同理 $S(4, 2) = S(3, 1) + 2 \times S(3, 2) = 1+2 \times 3 = 7, … $如此类推。
问题 5,球不同,盒同,盒不可以为空
问题 5:m 不同球,n 同盒,无空盒。
假设 S5(m,n)S5(m,n)S5(m,n) 为 m 个不同的球,放入 n 个相同的盒子,盒子不可以为空的放法总数。
考虑递推关系。假设 m 个球是依次放入盒子中的,即球是按照 1,2,3,...,m1,2,3,...,m1,2,3,...,m 的顺序放入的。显然,对于一种放法方案,我们固定一个放入顺序并不会增加或者减少方案的数目。
则 mmm 号球放入之前,有 m−1m-1m−1 个球放入 n 个盒子,方案数为 S5(m−1,n)S5(m-1,n)S5(m−1,n)。第 mmm 号球有 nnn 种放法(放入 n 个盒子中的任意一个),因此有 n×S5(m−1,n)n \times S5(m-1,n)n×S5(m−1,n) 种放法。
上述这种考虑,还缺一个方案,就是 mmm 号球放入的那个盒子,只有 mmm 号球。这时候,在 m 号球放入之前,是有空盒子的,这种情况不在 S5(m−1,n)S5(m-1,n)S5(m−1,n) 表达的范围内。因为盒子是相同的,因此在 mmm 号球放入之前,只有 n−1n-1n−1 个非空的盒子,方案数为 S5(m−1,n−1)S5(m-1, n-1)S5(m−1,n−1)。
综上,递推公式为:S5(m,n)=S5(m−1,n−1)+n×S5(m−1,n)S5(m,n) = S5(m-1,n-1) + n \times S5(m-1,n)S5(m,n)=S5(m−1,n−1)+n×S5(m−1,n)。
问题6,球不同,盒同,盒子可以为空
问题6:m 不同球,n 同盒,允许空盒(在问题 5 的基础上允许空盒)。
那就枚举空盒子的数量:一个空盒子都没有 + 有一个空盒子 + 有两个空盒子 + 有三个空盒子+ ,,,+都装在一个盒子里。
改写成公式就是:S6(m,n)=S5(m,1)+S5(m,2)+S5(m,3)+…+S5(m,n)S6(m,n) = S5(m, 1) + S5(m, 2) + S5(m, 3) + … + S5(m, n)S6(m,n)=S5(m,1)+S5(m,2)+S5(m,3)+…+S5(m,n)
也就是上面那个三角形,第 m 排开始第 1 个数字一直加到第 n 个数字。
问题 7,球不同,盒不同,盒不可以为空
问题 7:m 不同球,n 不同盒,无空盒。
问题 7 和问题 5 的区别是,盒子不同。那就先按照问题 5 分,然后把盒子全排列编号就行了。
所以问题 7 的解是:S7(m,n)=n!×S5(m,n)S7(m,n) = n! \times S5(m, n)S7(m,n)=n!×S5(m,n)。
组合数的计算方法
在讨论这些问题的,时候,需要计算组合数 Cmn=m!n!⋅(m−n)!C_m^n = \frac{m!}{n! \cdot (m-n)!}Cmn=n!⋅(m−n)!m! 。
常见的计算方法就是计算阶乘,然后除,这时候很容易溢出。
一个简单的变换是:Cmn=m!n!⋅(m−n)!=(n+1)⋅(n+2)⋅...⋅m(m−n)!C_m^n = \frac{m!}{n! \cdot (m-n)!} = \frac{(n+1) \cdot (n+2) \cdot ... \cdot m}{(m-n)!}Cmn=n!⋅(m−n)!m!=(m−n)!(n+1)⋅(n+2)⋅...⋅m ,这样溢出的可能性小一些。
课上温瀚博介绍一种办法,通过递推的方法算组合数。
组合数公式的递推公式:Cmn=Cm−1n−1+Cm−1nC_m^n = C_{m-1}^{n-1} + C_{m-1}^nCmn=Cm−1n−1+Cm−1n。
等式左边表示从 m 个元素中选取 n 个元素,而等式右边表示这一个过程的另一种实现方法:
任意选择m中的某个备选元素为特殊元素,从 m 中选 n 个元素可以由此特殊元素的被包含与否分成两类情况:
即 n 个被选择元素包含了特殊元素和 n 个被选择元素不包含该特殊元素。
前者相当于从 m-1 个元素中选出 n-1 个元素的组合,即 Cm−1n−1C_{m-1}^{n-1}Cm−1n−1;后者相当于从 m-1 个元素中选出 n 个元素的组合,即 Cm−1nC_{m-1}^nCm−1n。
问题 5 的搜索方案
问题 5:m 不同球,n 同盒,无空盒。
这个思路是魏诗然提出来的。
既然 n 个盒相同,我们不妨规定放球的时候,只能按照盒子的顺序单调不升的放。
那么,DFS 凑出每个盒子里面放球的个数,并保证 buf[1]≥buf[2]≥buf[3]≥...≥buf[n]≥1buf[1] \ge buf[2] \ge buf[3] \ge ... \ge buf[n] \ge 1buf[1]≥buf[2]≥buf[3]≥...≥buf[n]≥1
例如,5 个球 3 个盒子,可以拆分为:3 1 1,2 2 1。注意,两个放一个球的盒子可以互换。
我们对拆分后的方案计算组合数
盒子 1 的方案数 ans[1]=C(m,buf[1])ans[1] = C(m,buf[1])ans[1]=C(m,buf[1])
盒子 2 的方案数 ans[2]=C(m−buf[1],buf[2])ans[2] = C(m-buf[1],buf[2])ans[2]=C(m−buf[1],buf[2])
… …
盒子 n 的方案数 ans[n]=C(m−buf[1]−buf[2]−...−buf[n−1],buf[n])ans[n] = C(m-buf[1]-buf[2]-...-buf[n-1],buf[n])ans[n]=C(m−buf[1]−buf[2]−...−buf[n−1],buf[n])
根据乘法原理,总方案数应该是上述组合数相乘。
假设有 2 个盒子的球数相同,那组合数应该除以 2!2!2!,如果有 3 个盒子的球数相同,那组合数应该除以 3!3!3!。
我们假设每一种球数的盒子数量表示为:q[i]=jq[i]=jq[i]=j,即 2 个球的盒子有 j 个。
令 p=∏(q[i]!)q[i]≠0p = \prod (q[i]!) \quad q[i] ≠ 0p=∏(q[i]!)q[i]=0
ans=ans[1]×ans[2]×...×ans[n]pans = \frac{ans[1] \times ans[2] \times ... \times ans[n]}{p}ans=pans[1]×ans[2]×...×ans[n]
ans 是一组球的放法数量的组合数。此题的结果需要把不同的放法数量加起来就可以了。
总结
输出方案数问题是信息学竞赛中的一种常考题目。
通过【分球的八个问题】,可以帮我们把组合数学的加法原理、乘法原理和动态规划的方案递推思路认真梳理一遍,对锻炼这种题目的思考方法是很有帮助的。
更多推荐
所有评论(0)