【发布时间】:2016-02-19 09:49:54
【问题描述】:
对于我正在开发的应用程序,我需要处理一个数字数组并返回一个新数组,以使元素的总和尽可能接近目标总和。这与coin-counting problem 类似,但有两点不同:
- 新数组的每个元素都必须来自输入数组(即没有重复/重复)
- 当发现一个数组的总和在目标数的 X 范围内时,算法应该停止(例如,给定 [10, 12, 15, 23, 26],目标为 35,sigma 为 5,结果[10, 12, 15] 的结果(总和 37)是可以的,但 [15, 26] 的结果(总和 41)不是。
我正在考虑以下算法(在伪代码中),但我怀疑这是最好的方法。
function (array, goal, sigma)
var A = []
for each element E in array
if (E + (sum of rest of A) < goal +/- sigma)
A.push(E)
return A
不管怎样,我使用的语言是 Javascript。非常感谢任何建议!
【问题讨论】:
-
您是否有任何关于输入数组的先验信息(数字范围、长度等)?
-
@shapiroyaacov 这些数字通常在 100 到 600 之间(它们是歌曲长度,以秒为单位),输入数组的长度可以是大约 5 到 50 之间的任何地方(尽管这个数字不是不一定有界)。
-
还有进球数?对此有何意见?
-
@shapiroyaacov 目标数可以是 100 到 7200 之间的任何值。
-
这听起来像是en.wikipedia.org/wiki/Subset_sum_problem 的变体,因为输入是有限的,我认为蛮力,也许有一些调整应该能够做到这一点
标签: algorithm language-agnostic heuristics