好吧,我对哪种算法最适合我的问题有疑问。假设我有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个不同的组合,但这太多了。
我试图搜索非同构组,但没有运气。
答案 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个放在另外两个组中),然后看看剩下的。