【发布时间】:2013-08-06 09:54:30
【问题描述】:
您好,我正在寻找一种算法或函数来查找数组中的哪些元素组加起来达到某个数字。可能不止一个,所以我希望返回数组中从左到右读取的第一个好的组。
例如,假设我有一个随机数数组... $x = array(500, 90, 50, 200, 10, 300, 900) 我希望识别任何一组数组元素加起来给定数字 X,比如 1,000。
在这种情况下,数组 $x 的元素 0,3,5 是第一个加起来为 1,000 (500 + 200 + 300) 的元素。元素 1,4,6 也加起来 1,000 (90 + 10 + 900) 但不是第一个,所以我们可以忽略它们。 该函数应返回具有正确索引位置的新数组 $y = array(0,3,5)。
任何帮助表示赞赏!谢谢:-)
【问题讨论】:
-
这称为subset sum problem,通常无法在合理的时间内解决。当然对于这么小的输入,你可以暴力破解它。
-
问题是人类可以智能地解决这个问题,即使你可以让算法像人类一样思考这样的计算,但程序不会放弃人类很快就会意识到的地方没有正确的组合。换句话说,当你有一组没有解的数字时,程序所做的任何尝试都将是暴力破解。
-
有最大值吗?例如 1 到 4 个数字,或任何大于 1 的元素集合?另外,如果目标是 10,你会得到 10 的匹配,还是没有结果?
-
@Flosculus:“人类很快就会意识到没有正确的组合”=> 人类会错的。您可以在脑海中解决这个问题的案例非常简单,以至于您的手机可以在您阅读数字的时间内解决一千次。
-
@Flosculus:当然,如果您希望他们(random example),他们可以停下来想“这太花时间了”。无论如何,这与最初的“人类将意识到没有正确的组合”完全不同——人类在这类工作中实际上是无用的。更准确的说法是“一个人会意识到他们无法找到解决方案,除非靠运气并在几分钟后放弃”。
标签: php arrays algorithm sorting