无连续空乞丐的饼干分配计数问题的优化解法及扩展场景求解咨询
问题描述
求将10块饼干分给排成一排的5个乞丐,且没有两个连续乞丐空着的分配方式数$N$。
原分情况解法
我之前通过枚举合法空乞丐组合的方式解决了这个问题:
Case 1:没有乞丐空着
需要把10块饼干分给5个乞丐,每个至少1块,用星与条公式计算方法数:
$${(10-5)+(5-1)\choose 5-1}={9\choose 4}$$
Case 2:恰好1个乞丐空着
由于不能有连续空乞丐,合法的空位置有5种(对应组合AAAAB、AAABA、AABAA、ABAAA、BAAAA)。每种情况相当于把10块饼干分给4个乞丐,每个至少1块,总方法数:
$$5\times{(10-4)+(4-1)\choose 4-1}=5\times {9\choose 3}$$
Case 3:恰好2个乞丐空着
合法的空位置组合有6种(比如ABABA、BAABA、AABAB、BABAA、BAAAB、ABAAB),对应把10块饼干分给3个乞丐,每个至少1块,总方法数:
$$6\times {9\choose2}$$
Case 4:恰好3个乞丐空着
只有1种合法组合BABAB,对应把10块饼干分给2个乞丐,每个至少1块,方法数:
$${9\choose1}$$
将所有情况求和,最终结果为771。
注:这里用A表示拿到饼干的乞丐,B表示没拿到饼干的乞丐
疑问解答:通用优化解法及扩展场景
当然有更高效的通用解法,不用逐个枚举空位置组合,尤其适合乞丐数量多的场景(比如15个乞丐、25块饼干的情况),思路如下:
通用建模思路
核心是把约束转化为数学公式:
- 空乞丐的合法选法:设空乞丐数量为$m$,由于不能连续空,从$k$个乞丐中选$m$个不相邻位置的方法数为${k - m + 1 \choose m}$(经典不相邻组合公式)。
- 饼干分配方法:对于每一种选$m$个空乞丐的情况,剩下的$k-m$个乞丐每个至少拿1块饼干,用星与条公式,分配$n$块饼干的方法数为${n - 1 \choose k - m - 1}$。
因此总分配方式数为所有合法$m$值的求和:
$$N = \sum_{m=0}^{max_m} {k - m + 1 \choose m} \times {n - 1 \choose k - m - 1}$$
其中$max_m$是满足两个条件的最大空乞丐数:
- $m \leq \lfloor \frac{k+1}{2} \rfloor$(不能有连续空乞丐的上限)
- $k - m \leq n$(非空乞丐数不能超过饼干数,保证每个至少1块)
原问题验证
代入原问题的$k=5$、$n=10$:
- $m=0$:${5-0+1 \choose 0} \times {9\choose4} = 1 \times {9\choose4}$,对应Case1
- $m=1$:${5-1+1 \choose1} \times {9\choose3}=5 \times {9\choose3}$,对应Case2
- $m=2$:${5-2+1 \choose2} \times {9\choose2}=6\times{9\choose2}$,对应Case3
- $m=3$:${5-3+1 \choose3} \times {9\choose1}=1\times{9\choose1}$,对应Case4
- $m\geq4$时,${k-m+1 \choose m}$为0,无需计算,求和结果和分情况一致。
扩展场景:15个乞丐,25块饼干
用通用公式直接计算:$k=15$,$n=25$,$max_m=\lfloor\frac{15+1}{2}\rfloor=8$,因此:
$$N = \sum_{m=0}^8 {16 -m \choose m} \times {24 \choose14 -m}$$
逐项计算后求和即可得到结果,无需枚举空位置组合,效率大幅提升。
备注:内容来源于stack exchange,提问作者mathophile

