如何列出C++数组中所有可能的组合和

How to list all the possible sums of combinations in an array for C++?

本文关键字:有可能 组合 何列出 C++ 数组      更新时间:2023-10-16

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

假设我有一个由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)的所有组合和。

好吧,这里有一个简单的规则:

"ABCDE"的所有组合的集合由包含(因此以)"A"的组合和不包含"A"(因此以"A"开头)的组合组成。在这两种情况下,都可能出现"BCDE"的所有组合。当然,"BCDE"的组合也可以用同样的方式处理。

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

如果是,则搜索一次取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"不同)将对您的结果产生很大影响;在大多数情况下,这可能不是您想要的。

如果你有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,并返回映射函数生成的所有集合。