【问题标题】:Given n integers, find the m whose sum's absolute value is minimal给定n个整数,求和的绝对值最小的m
【发布时间】:2011-05-29 03:30:32
【问题描述】:

我有 n 个整数;包括正值和负值。什么是从该列表中找到 m 个整数的好算法,以使这些 m 个整数之和的绝对值尽可能小?

【问题讨论】:

  • 我认为这就是“教授”希望决定的……这是作业吗?
  • 这个问题不傻。它要求求和的绝对值,而不是绝对值的总和。对于 {-10,1,2,3,10} 和 m=2,答案是 {-10,10}。
  • @Neal - 请注意,如果您将其标记为家庭作业,那么您至少有机会以某种方式帮助您。这可能比您想要的要少得多,但比现在要大。 :)
  • @pavium 绝对不是。我记得教授的作业总是不难解决。不像这个,我已经花了 3 周的时间,但我和我的同事都无法得到一个好的算法。
  • @Neal - 新用户,非常具体的单词问题,没有提供代码。如果这不是家庭作业,那真是太巧合了。你试过programmers.stackexchange.com吗?

标签: algorithm


【解决方案1】:

这个问题是 NP-hard,因为有效地解决它会有效地解决 subset-sum decision problem

鉴于此,除非您相信 P=NP,否则您不会找到有效的算法来解决它。

您总是可以想出一些启发式方法来指导您的搜索,但在最坏的情况下,您必须检查 m 个整数的每个子集。

【讨论】:

  • 实际上,如果您查看子集和问题的近似算法(该链接是一个不错的开始),您也许可以根据您的问题调整其中一些算法。
【解决方案2】:

如果“好”意味着“正确”,那么请尝试所有可能性。这将花费您大约n choose m 时间。非常慢。不幸的是,这通常是你能做的最好的,因为对于任何一组整数,你总是可以再加一个,它是m-1其他整数之和的负数——而其他整数可能都有相同的符号,所以你没有办法搜索。

如果“好”的意思是“快速且通常可以正常工作”,那么有多种方法可以继续。例如:

假设您可以解决m=2 的问题,并进一步假设您可以解决肯定和否定答案(然后取两者中较小的一个)。现在假设你想解决m=4。求解m=2,然后抛出这两个数字并再次求解...应该很明显下一步该做什么!那么m=6呢?

现在假设您可以解决m=3m=2 的问题。您认为m=5 可以得到一个不错的答案吗?

最后,请注意,如果您对数字进行排序,您可以一次性解决m=2,而对于m=3,您需要进行烦人的二次搜索,但至少您只能在大约四分之一的时间内完成列表的两次(正数和负数的小半部分)并寻找一些相反的符号来取消。

【讨论】:

  • kerr - “正确”的想法很容易得到,但我试图让它“快速并且通常可以正常工作”,然后我发现这并不容易,因为正如你所说,m可以改变...
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 2020-11-13
  • 1970-01-01
  • 2011-12-09
  • 2015-12-09
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
相关资源
最近更新 更多