【问题标题】:Checking for Summed Zeros Sets检查总零集
【发布时间】:2021-02-15 20:22:20
【问题描述】:

一位朋友请我回答一个小挑战,以及我们是否可以找到最佳解决方案。挑战在于,给定一组随机的负数和正数,ie. (-10, -7, -4, -3, 1, 4, 4, 6, 12) 我们如何为等于 0 的正数和负数集创建一个有效的算法,留下最少的未使用数?

示例:给定集合 (-10, -7, -4, -3, 1, 4, 4, 6, 12)

0 的可能集合:{-10, -7, 1, 4, 12}, {-4, 4}

剩余数字:{-3, 6}

一些想法是尝试动态编程,但我预见到要在很长的时间范围内完成会出现问题。另一个想法是尝试创建一个线性程序,其中所有数字排列在一个集合中,并创建尝试达到 0 的子集,这遇到了以前的负数可以被使用但被忽略的问题,除非使用 for 循环来重复负数值大于 0 时的数字。

【问题讨论】:

  • 那你有什么问题?
  • 不,关于回答我的问题。我没有看它是否难于 NP,因为我目前正试图自己解决它。所以看起来,无论算法如何,它都会以指数方式运行。问题在于寻找 0 集的有效算法,但我制定的算法一直呈指数级增长,我不知道其他人是否有避免它的想法。
  • @EvilDrCoconut 这有时被称为最简单的难题。因为它是 NP 完全的,但动态规划解决方案在伪多项式时间内运行,这在实践中非常好。

标签: algorithm


【解决方案1】:

正如 Ezequiel Muns 所给出的,这是一个称为子集和问题的 NP 完全问题(更多信息可以在 en.wikipedia.org/wiki/Subset_sum_problem 找到)。

在寻找解决方案之前,我曾尝试过自己的想法,但在询问了其他几个人之后,我似乎在没有意识到的情况下遇到了一个 NP-Hard 问题。我只是认为我自己的算法效率低下,也许有人有更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2018-01-14
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多