具有不同组能力的组合

时间:2009-05-21 22:58:31

标签: algorithm

好吧,我对哪种算法最适合我的问题有疑问。假设我有3组:

Group A) 1 2 3 
Group B) 5 4
Group C) 9 6 7 8

现在我想获得所有可能的小组成员(1-8)和容量为3,2,4的小组。

注意:

Group A) 3 1 2
Group B) 5 4
Group C) 7 8 9 6

计为与上述组合相同的组合。

我尝试了这些数字的所有可能组合(1-8),但我知道我可能有一个总共30名成员的组,我会想出265252859812191058636308480000000个不同的组合,但这太多了。

我试图搜索非同构组,但没有运气。

1 个答案:

答案 0 :(得分:2)

我假设没有数字可以输入两次(你的第一个例子中有两个3,而你的第二个例子中有两个3),所以我只使用数字1-9和相同数量的元素在每个小组中。

根据你对组合学的了解程度,你会了解或多或少 - 如果你不明白,请询问,我会尽力详细解释。

您的问题非常标准 - 您希望将一组9个元素分别分为3个,2个和4个元素的子集。这称为multinomial *,计算如下:

n = 9! / (3!*2!*4!)

基本上,你做的是:

1)为A组选择3个元素:n1 = 9 choose 3.
2)为B组选择2个元素:n2 = 6 choose 2.
3)其余四个要素是C组。

总计:

n = n1 * n2 = 9!/(3!6!) * 6!/(2!4!) = 9! / (3!*2!*4!)

*)请参阅有关“分区”的部分

编辑:我在问题评论中注意到了一些特殊要求(例如6个讨厌9)。如果你有这样的话,先看看他们(将9个放在一个组中,6个放在另外两个组中),然后看看剩下的。