我给出了 n 整数;包括正值和负值。从该列表中找到 m 整数的好算法是什么,这样 m 整数之和的绝对值是最小的?
答案 0 :(得分:5)
问题是NP难的,因为有效地解决它会有效地解决subset-sum decision problem。
鉴于此,除非您认为P = NP,否则您不会找到有效的算法来解决它。
您可以随时提出一些启发式方法来指导您的搜索,但在最糟糕的情况下,您必须检查 m 整数的每个子集。
答案 1 :(得分:2)
如果“好”意味着“正确”,那么只要尝试一切可能性。这将花费您n choose m
时间。非常慢。不幸的是,这是你一般可以做的最好的事情,因为对于任何一组整数,你总是可以添加一个,这是m-1
其他的总和的负数 - 而其他人可能都有相同的符号,所以你无法搜索。
如果“好”意味着“快速且通常可行”,那么有多种方法可以继续。 E.g:
假设您可以解决m=2
的问题,并且假设您可以进一步解决正面和负面答案(然后取两者中的较小者)。现在假设您要解决m=4
。解决m=2
,然后将这两个数字抛出并再次解决......应该明白下一步该做什么!现在,m=6
怎么办?
现在假设您可以解决m=3
和m=2
的问题。认为你可以为m=5
获得一个不错的答案吗?
最后请注意,如果您对数字进行排序,则可以在一次传递中解决m=2
,对于m=3
,您可以进行令人烦恼的二次搜索,但至少可以在只有大约四分之一的名单(正数和负数的一半),并寻找一些相反的符号来取消。