Algorithm 求解动态规划练习的算法(背包型)
这是一个挑战:输入是一个由N个整数组成的数组X(N在0到10000之间,X[i]在-100到100之间)。目标是从集合{-1;1}中找到一个由N个整数组成的序列D,这样Algorithm 求解动态规划练习的算法(背包型),algorithm,geometry,dynamic-programming,knapsack-problem,Algorithm,Geometry,Dynamic Programming,Knapsack Problem,这是一个挑战:输入是一个由N个整数组成的数组X(N在0到10000之间,X[i]在-100到100之间)。目标是从集合{-1;1}中找到一个由N个整数组成的序列D,这样 S = | sum_i (X[i] * D[i]) | 最小化。如果我们输出整数S(不需要明确地找到使S最小化的序列D),问题就解决了 我目前的研究: 计算 M=总和i | X[i]| 以M/2为背包容量,X为物品列表,求解0-1背包问题。它给出了正确的答案,但复杂性太高 对于0到n范围内的整数n和-100到100范围内的r,
S = | sum_i (X[i] * D[i]) |
最小化。如果我们输出整数S(不需要明确地找到使S最小化的序列D),问题就解决了
我目前的研究:
s(n, r) = s(n - 1, r - X[n]) || s(n - 1, r + X[n])
也就是说,如果r可以通过前n个项目达到,那么r-X[n]或r+X[n]可以通过前(n-1)个项目达到
从这个性质可以很容易地计算出给定范围内任意r的s(N,r)。
当X按降序排序时,返回正确答案的几率会大得多,但在某些情况下仍然不正确。也许可以通过为r提供更大的范围来更正,但我现在还不知道是否有一个可接受的范围
诀窍是D[i]来自X[i]的相反顺序排列通过确保最小因子与最大因子相乘,以及每个较小因子与每个较大因子以归纳方式配对,从而使总和最小化。从技术上讲,这是因为欧几里德定理;因此,总和的每个乘积都具有最小的素因子集。可以找到X与气泡s的顺序排列在一组基数为N的指数I上并行运行的ort。理解背包问题的关键在于,高维的旋转对应于向量空间中的转置。诀窍在于D[I]来自X[I]的相反顺序排列通过确保最小因子与最大因子相乘,以及每个较小因子与每个较大因子以归纳方式配对,从而使总和最小化。从技术上讲,这是因为欧几里德定理;因此,总和的每个乘积都具有最小的素因子集。可以找到X与气泡s的顺序排列ort在一组指数I和基数N上并行运行。理解背包问题的关键是,在更高维度上的旋转对应于向量空间中的转置。您不能对您的帖子设置与冲突的限制,请参见我们的。在这里发布,您同意这些条款。非常感谢您的支持建设性的回答,威廉!我现在有很多问题:D[I]是从X[I]的相反顺序排列来的,这意味着什么?什么是顺序排列?欧几里德定理说明素数是无限的。你最后一句话的意思是什么(“理解背包问题的关键是,高维的旋转对应于向量空间中的换位。”)?这个答案似乎解决了一个不同的问题:即,给定一个
X
和D
的数组,重新排列每个数组,使和(X[i]*D[i])
最小化(注意没有绝对值,注意X
s的集合是固定的)。我不知道这怎么能解决@Brainless的问题。你不能对你的帖子设置与之冲突的限制,请参阅我们的。通过在这里发布,你同意这些条款。非常感谢你的建设性回答William!我现在有很多问题:D[I]来自X[I]的相反顺序排列是什么意思“?什么是序数置换?欧几里德定理指出素数是无限的。你最后一句话的意思是什么(“理解背包问题的关键是,高维的旋转对应于向量空间中的转置。”)这个答案似乎解决了一个不同的问题:即,给定一个X
和D
的数组,重新排列每个数组,使sum(X[i]*D[i])
最小化(注意没有取绝对值,注意X
的集合是固定的)。我看不出它如何解决@Brainless的问题。