求解由9个A、7个B、6个C构成且无相邻B的不同排列数
求解由9个A、7个B、6个C构成且无相邻B的不同排列数
嗨,咱们一步步来理清楚这个问题——先从你已经懂的2个B的情况入手,再解决7个B的难题:
先回顾2个B的验证思路
你之前用「总排列数减去存在相邻BB的排列数」的思路完全正确:
- 总排列数:9个A、2个B、6个C一共17个元素,排列数是
C(17,9)*C(8,2)(先选9个位置放A,再从剩下8个位置里选2个放B,最后剩下的位置放C) - 存在相邻BB的排列数:把
BB当作一个整体,此时相当于要排列16个元素(1个BB、9个A、6个C),排列数为C(16,9)*C(7,1)(选9个位置放A,再从剩下7个位置里选1个放BB) - 无相邻B的排列数 = 总排列数 - 相邻BB的排列数,计算后和更通用的插空法结果完全一致。
7个B的最优解法:插空法
当B的数量增加到7个时,再用「总排列数减去所有相邻情况」就会变得异常复杂——毕竟7个B可能出现2个相邻、3个相邻、多个相邻块等各种组合,用容斥原理枚举起来步骤繁琐。这时候经典的插空法是最省心的解法,步骤如下:
- 先排非B元素:先把9个A和6个C全部排好,这部分的排列数是
C(15,9)(从15个位置里选9个放A,剩下的位置自然放C) - 找空隙放B:15个非B元素排好后,会产生
15+1=16个空隙(包括序列的两端,比如_ A _ C _ A _ ... _ C _),每个空隙最多放1个B,这样就能保证所有B都不相邻。我们需要从这16个空隙里选7个来放B,选法是C(16,7) - 计算总排列数:把两步的结果相乘,就是最终满足条件的排列数:
C(15,9) * C(16,7)
这个方法逻辑清晰,完全避开了复杂的相邻情况枚举,比硬算容斥法简单太多啦。
备注:内容来源于stack exchange,提问作者tonythestark
相关产品推荐
相关产品推荐

