我想将大小为n的整数数组消除为两个数,只需将两个数相乘即可。这两个数字(M1和M2)的条件是减去M1-M2的结果是其他可能情况中的较小值。 以下示例更详细地说明了该问题:
假设数组的大小为4,元素为[n1,n2,n3,n4]
可能的抵消是:
M1 = n1且 M2 = n2xn3xn4
M1 = n2且 M2 = n1xn3xn4
M1 = n3且 M2 = n1xn2xn4
M1 = n4且 M2 = n1xn2xn3
M1 = n1xn2且 M2 = n3xn4
M1 = n1xn3且 M2 = n2xn4
M1 = n1xn4且 M2 = n2xn3
M1 = n2xn3且 M2 = n1xn4
M1 = n2xn4且 M2 = n1xn3
M1 = n3xn4且 M2 = n1xn2
在这个例子中有十个可能的值 M1 和 M2 ,在我的问题中我想要它的正确值是ABS的最小值(其他九个值中的M1 - M2 )。它们有可能不止一个正确的答案(类似),但这可以忽略,我想要的输出是 M1 的一个值和 M2的一个值
注意:如果是在C ++中,我将不胜感激:)
提前致谢...
答案 0 :(得分:1)
我会使用std::next_permutation
来生成输入数组的所有排列,并且对于每个排列,您多次使用std::accumulate
来创建不同的产品(即M1
所在的一个产品只是排列的第一个元素,M2
是其余的,一个产品M1
是排列的前两个元素,M2
是剩下的等等,直到你点击中间)。
这不是最佳选择,因为它会生成一些重复的产品,即它会使用[n1, n2, n3, n4]
和M1 = n1 * n2
来处理排列M2 = n3 * n4
,之后它会处理排列{{1} } [n2, n1, n4, 3]
和M1 = n2 * n1
。解决方案非常简单易写,但它无法利用乘法是可交换的这一事实。