You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何计算从含重复类型的可区分集合中选取x个元素的合法组合数

嘿,咱们一步步来解决你的组合计数问题,先从你给出的具体例子入手,再推广到通用方法,最后搞定你提到的第一个问题:

解答你的组合计数问题

一、你的具体例子的计算方法

先看你给的13个对象:A-G各1个,H有2个,I有4个,要求选6个且同一字母类型最多选1个。这个问题可以拆成两步想:先选要包含哪几种类型,再从每种选中的类型里挑一个具体对象,最后把所有可能的情况加起来就行。

咱们分4种情况来算:

  • 情况1:不选H也不选I
    只能从A-G这7种类型里挑6种,每种类型只有1个对象可选。选类型的方式是组合数C(7,6)=7,每种组合对应的对象选择只有1种,所以这部分总数是7×1=7。

  • 情况2:选H但不选I
    需要从A-G里挑5种,加上H类型。选类型的方式是C(7,5)=21,H类型有2个对象可选,其他5种各1种,所以每种组合的对象选择数是2×1×1×1×1×1=2,这部分总数是21×2=42。

  • 情况3:选I但不选H
    和情况2类似,从A-G里挑5种加I类型,选类型的方式是C(7,5)=21,I类型有4个对象可选,所以这部分总数是21×4=84。

  • 情况4:既选H又选I
    需要从A-G里挑4种,加上H和I类型。选类型的方式是C(7,4)=35,H有2种选择、I有4种选择,其他4种各1种,所以每种组合的对象选择数是2×4×1^4=8,这部分总数是35×8=280。

把所有情况加起来:7+42+84+280=413,这就是你例子的合法选取方式总数。

二、通用化的计算方法

如果换成一般情况:假设集合有k种不同类型,第i种类型有m_i个可区分的对象,要选x个对象且每种类型最多选1个,总方式数可以这么算:

  1. 先枚举所有从k种类型里选x种的可能子集;
  2. 对每个选中的类型子集,把每种类型的可选对象数相乘(因为每种类型选一个,选择是独立的);
  3. 把所有这些乘积加起来,就是总合法方式数。

用数学语言说,就是计算第x个初等对称多项式m₁, m₂, ..., mₖ处的值,公式写出来是:
$$\sum_{\substack{S \subseteq {1,2,...,k} \ |S|=x}} \prod_{i \in S} m_i$$

三、关于你第一个问题:非互异集合中选x个不同子集的数量

你说的“非互异集合”应该是指多重集合(比如有重复元素的集合,像{2个a, 3个b}这种)。如果是要算从多重集合里选x个元素的不同组合(不考虑顺序),分两种情况:

  • 如果每种元素的数量都≥x:这是经典的「可重复组合」问题,公式是C(x + k - 1, x),其中k是不同元素的类型数;
  • 如果有的元素数量小于x:这时候得用容斥原理来排除那些选了超过元素数量的组合。比如多重集合S={n₁*a₁, n₂*a₂, ..., nₖ*aₖ},选x个元素的组合数公式是:
    $$\sum_{S' \subseteq {1,2,...,k}} (-1)^{|S'|} C(x - \sum_{i \in S'}(n_i+1) + k - 1, k - 1)$$
    (注意:如果x - ∑(n_i+1)是负数,对应的组合数就按0算)

内容的提问来源于stack exchange,提问作者user527452

火山引擎 最新活动