这是挑战:输入是N个整数的数组X(N在0到10&#39,000范围内,X [i]在-100到100范围内)。目标是找到一个由集合{-1;中的N个整数组成的序列D. 1}这样
element.attr({title: 'The tooltip to be displayed on mouse hover'});
最小化。如果我们输出整数S(不需要明确地找到最小化S的序列D),问题就解决了。
我目前的研究:
计算
M = sum_i | X [i] |
解决0-1背包问题,M / 2作为背包容量,X作为项目列表。它给出了正确的答案,但复杂性太高了。
对于范围为0到N且r范围为-100到100的整数n,请定义
如果存在来自集合{-1的整数的长度为n的序列D,则s(n,r)= 1; 1}这样r = | sum_ {i = 0到n}(X [i] * D [i]} |
s(n,r)= 0否则。
然后s具有以下属性:
S = | sum_i (X[i] * D[i]) |
转换为Engish,如果可以使用前n个项目达到r,则可以使用第一个(n - 1)项目到达r - X [n]或r + X [n]。
从这个属性可以很容易地计算出给定范围内任何r的s(N,r)。 当X按递减顺序排序时,它提供了更多返回正确答案的机会,但在某些情况下它仍然不正确。也许可以通过为r提供更大的范围来纠正,但是如果有可接受的范围,我现在还没有。
提示:
答案 0 :(得分:0)
诀窍是D [i]来自X [i]的相反序数排列。这通过确保最小因子乘以最大因子来最小化总和;并且每个较小因素与每个较大因子相关地归纳。从技术上讲,这是因为欧几里德定理;所以总和的每个乘积都具有最小的素因子集。人们可以在一组带有基数N的指数I上找到X的序数排列,这种排序是并行的。理解背包问题的关键是更高维度的旋转对应于向量空间中的换位。