如何列出c ++数组中所有可能的组合总和?

时间:2012-01-14 02:03:55

标签: c++ algorithm superset

我有我的家庭作业,我不知道如何开始这类问题的代码。

假设我有一个由n个元素组成的整数数组

[A] [B] [C] [D] [E](我们有5个元素)

我想列出所有可能性的总和,以便打印出来 所有组合的总和(ABCDE,ABCD,ABCE,ACDE,BCDE,ABC,ABD,ABE,ACE,ADE,BDE,CDE,AB,AC,AD,AE,BC,BD,BE,CD,CE,DE,A ,B,C,D和E)

另一个例子是数组中的4个元素([A] [B] [C] [D])

我想列出所有组合的总和(ABCD,ABC,ABD,ACD,BCD,AB,AC,AD,BC,BD,CD,A,B,C和D)。

我希望你们都能理解我的问题。我需要帮助,我不知道怎么办?

3 个答案:

答案 0 :(得分:2)

嗯,这是一个简单的规则:

" ABCDE"的所有组合的集合由包含(并因此开始)" A"的组合组成。那些不包含" A"。在这两种情况下," BCDE"的所有组合都是可以发生。当然," BCDE"可以用同样的方式对待。

答案 1 :(得分:0)

当你说“列出所有可能性的总和”时,你的意思是你想知道实际可能有多少组合?

如果是,则搜索一次取K个N个项目的组合;这个网站上有一些页面可以解决这个问题。然后,您只需添加(按5)+(按4)+(按3)+(按2)+(按1)组合的数量,即可获得总数“可能性总和”。

或者你的意思是你有一系列的值,你真的想要打印出由不同元素组合表示的不同总和?在这种情况下,您需要实际枚举所有组合并评估总和。

因此,给定{1,2,3,4,5}数组,您可以将其编码为“A”,“B”,“C”,“D”,“E”。元组的例子是:

  • ABCDE = 1 + 2 + 3 + 4 + 5
  • ABE = 1 + 2 + 5
  • BCE = 2 + 3 + 5

等,您可以使用编码的枚举来选择总和的加数。请注意,决定是允许还是禁止重复(即“DE”与“ED”不同)将对您的结果产生非常大的影响;在大多数情况下,这可能会成为你想要的。

答案 2 :(得分:0)

如果您有3个元素,您可以想象每个元素放置在1到3(或0到2)的某个位置,以及一个布尔数组,表示该元素是否包含在某个集合中。

ABC remark
--- ---------------------
000 no element in the set
001 one element, C
010 one element, b
100 ...
011 two elements, b and c
...
111 all elements contained

现在,如果你计算解决方案的数量,在这种情况下是2³,并生成一个函数,它执行从二进制表示到集合的映射,例如从011到(b,c),那么你可以轻松编写一个循环,循环从0到max-1迭代并返回由映射函数生成的所有集合。