解决动态规划练习的算法(背包式)

时间:2015-07-15 07:55:05

标签: algorithm geometry dynamic-programming knapsack-problem

这是挑战:输入是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),问题就解决了。

我目前的研究:

  1. 计算

    M = sum_i | X [i] |

  2. 解决0-1背包问题,M / 2作为背包容量,X作为项目列表。它给出了正确的答案,但复杂性太高了。

    1. 对于范围为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否则。

    2. 然后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提供更大的范围来纠正,但是如果有可接受的范围,我现在还没有。

      1. 几何/线性代数方法:将所有可能的序列D视为欧几里德空间中的向量R ^ k(k> = N),并在R ^ k的正交基中划分所有可能的集合D,然后写入X在每个新的基地。但我不希望它会起作用......
      2. 提示:

        1. N的范围(X的大小)远大于每个X [i]的范围。因此序列X将有重复。

1 个答案:

答案 0 :(得分:0)

诀窍是D [i]来自X [i]的相反序数排列。这通过确保最小因子乘以最大因子来最小化总和;并且每个较小因素与每个较大因子相关地归纳。从技术上讲,这是因为欧几里德定理;所以总和的每个乘积都具有最小的素因子集。人们可以在一组带有基数N的指数I上找到X的序数排列,这种排序是并行的。理解背包问题的关键是更高维度的旋转对应于向量空间中的换位。