我遇到了以下问题,由于网格布局不足以及数学函数的经验不足,我不确定该如何解决。
编写一个函数,以从以下一组数字创建置换,以使三个或更少的整数之和等于1或2或3或4或5。然后根据置换之和对置换进行分组。 例如:
[z,b]; [y,a]; [x,a]; ...属于置换集1
[z,b] [y,a]; [z,e]; [y,a] [x,a] ....属于置换集2
a, b, c, d, e
z 3, 1, 5, 4, 2
y 1, 3, 2, 5, 4
x 1, 4, 3, 5, 2
w 3, 2, 5, 1, 4
v 4, 1, 5, 2, 3
u 3, 2, 4, 5, 1
t 1, 5, 4, 2, 3
s 5, 2, 1, 4, 3
r 5, 3, 2, 4, 1
q 5, 3, 4, 1, 2
例如: [z,a] => 3 [z,b] => 1 + [z,e] => 2 = 3
因此,[[[[z,a]],[[z,b],[z,e]]]是元素总和为3的排列的样本解集。解决方案集包含3个或更少的元素。
类似地,在元素的置换集合中总和为3的元素也将更多。此外,在元素的置换集合中总和为1,2,4或5的子集。
答案 0 :(得分:1)
与其说数学是问题,不如说是编码问题。
下面我首先介绍了您的数组,这使循环变得更容易。然后,当我需要标签时,只需按索引进行计算即可。
完成此操作后,我刚刚创建了一个多级循环,该循环将迭代每个组合50 * 50 * 50、125000个组合,在每个级别上都会进行检查,组合1,组合2,等等。还有一个检查,以确保它不重复索引,例如。 1 1 1,无效。
forEach部分只是首先循环输入,然后将值传递,并将组成该值的索引传递到check函数中。在此forEach中,它为第二个编号执行另一个forEach,依此类推。因此,您在前3个样本(不包括重复项)中得到的结果是-> 3 [0]
,3 + 1 [0, 1]
,3 + 1 + 5 [0,1,2]
,因此得到3:za
{{1} },最后一个将被跳过,等于9。
4:[za,zb]
只是为了确保我们不会重复,例如。 if (l1ix <= l0ix) return;
和[za,zb]
的分类相同,这是因为我确保下一级索引始终大于上一级索引。
下面是一个示例片段。
[zb,za]