Math 多组组合

Math 多组组合,math,combinations,counting,Math,Combinations,Counting,如何以编程方式将一组数字的所有可能的唯一组合枚举到多个组中 例如,如果我有集合{1,2,3,4,5,6,7,8,9,10},我想要3个大小为3,3,2的组,一个可能的子集将是{[1,2,3],[4,5,6],[7,8]} 这将相当于{[3,2,1],[6,5,4],[7,8]},并将被视为重复 而{[4,2,3],[1,5,6],[7,8]}将被视为一个不同的子集 显然,我正在寻找最有效、最实用的方法。我将使用一个相当大的N,因此算法需要可扩展 考虑这个问题的另一种方式是多重集合的置换 {1,1

如何以编程方式将一组数字的所有可能的唯一组合枚举到多个组中

例如,如果我有集合{1,2,3,4,5,6,7,8,9,10},我想要3个大小为3,3,2的组,一个可能的子集将是{[1,2,3],[4,5,6],[7,8]}

这将相当于{[3,2,1],[6,5,4],[7,8]},并将被视为重复

而{[4,2,3],[1,5,6],[7,8]}将被视为一个不同的子集


显然,我正在寻找最有效、最实用的方法。我将使用一个相当大的N,因此算法需要可扩展

考虑这个问题的另一种方式是多重集合的置换
{1,1,1,2,2,2,3}
。如果这样的排列
p
j
位置有值
i
,这意味着原始集合中的元素
j
应该放在分区
i

使用C++模板,可以列举如下排列:

intmain(){
inta[]={0,0,0,1,1,1,2,2};
做{
//这里a[j]==i表示集合中的元素j位于分区i中。
//对以这种方式生成的置换执行任何操作。
}while(std::next_置换(a,a+8));
}

结果将包含10个/(3!3!2!)=560种不同的组合。下面是该代码的演示运行,包括与问题陈述中使用的符号类似的输出。如果您想知道如何为gcc实现
next_permutation
,您可以查看一下,但只有在目标项目的许可证允许复制该代码的情况下,才可以这样做。

您知道如何迭代给定大小的所有子集吗?您可以想出大量可能的分区。我怀疑任何东西都不能扩展到大型n。你具体想做什么?从你的问题来看,还不完全清楚
{[4,5,6],[1,2,3],[7,8]}
是否会被视为与给定的两个示例相同。我下面的回答目前假定没有,但您可能希望明确说明这一点。