use*_*610 10 algorithm loops permutation
我很难开始为这个问题布局代码.
我有固定数量的随机数,在这种情况下是8个数字.R [] = {1,2,3,4,5,6,7,8};
这将被放置在3组数字中,唯一的约束是每组包含最少一个值,并且每个值只能使用一次.编辑:应使用所有8个数字
例如:
R1 [] = {1,4}
R2 [] = {2,8,5,6}
R3 [] = {7,3}
我需要遍历集合R1,R2,R3的所有可能组合.订单并不重要,所以如果上面的例子发生了,我就不需要了
R1 [] = {4,1}
R2 [] = {2,8,5,6}
R3 [] = {7,3}
也不
R1 [] = {2,8,5,6}
R2 [] = {7,3}
R3 [] = {1,4}
什么是好方法?
可能不是最好的方法,但它应该有效。
确定总和为 8 的三个数字的组合数:
1,1,6
1,2,5
1,3,4
2,2,4
2,3,3
Run Code Online (Sandbox Code Playgroud)
为了找到上面的内容,我从以下开始:
6,1,1 then subtracted 1 from six and added it to the next column...
5,2,1 then subtracted 1 from second column and added to next column...
5,1,2 then started again at first column...
4,2,2 carry again from second to third
4,1,3 again from first...
3,2,3 second -> third
3,1,4
Run Code Online (Sandbox Code Playgroud)
知道不到一半是 2,所有组合都必须找到……但由于列表不长,我们不妨到最后。
现在对每个 3 的列表从最大到最小进行排序(反之亦然) 现在对每个 3 的列表进行相对彼此的排序。将每个唯一列表复制到唯一列表的列表中。现在我们已经有了加起来为 8 的所有组合(我认为有五个列表)。
现在考虑上面集合中的一个列表
6,1,1 所有可能的组合可以通过以下方式找到:
8选6,(因为我们选了6个,所以只剩下2个可供选择)2选1,1选1,结果是28 * 2 * 1 = 56,值得知道有多少种可能性,这样你就可以测试。
n 选择 r (从总共 n 个选项中选择 r 个元素)
n C r = n!/ [(nr)!!]
所以现在你得到了列表中每个组件的迭代总数,其中第一个组件是 28...
从 8 个元素中挑选 6 个元素与创建一个 8 减 2 元素的列表相同,但是哪两个元素呢?
如果我们去掉 1,2 就剩下 3,4,5,6,7,8。让我们考虑所有 2 组...从 1,2 开始,下一个将是 1,3...所以下面是逐列阅读的。
12
13 23
14 24 34
15 25 35 45
16 26 36 46 56
17 27 37 47 57 67
18 28 38 48 58 68 78
Run Code Online (Sandbox Code Playgroud)
将上面每一列相加得出 28。(因此这仅覆盖了列表中的第一个数字 (6,1,1),对第二个数字(一个)重复该过程,即“2 选择 1”所以左边从上面的列表中超过两位数,我们选择两个中的一个,然后对于最后一个,我们选择剩下的一个。
我知道这不是一个详细的算法,但我希望您能够开始使用。