【发布时间】:2014-02-21 03:40:41
【问题描述】:
如果我有一个数字数组和一个总计数组元素的总和列表,那么确定总和中包含哪些元素的最有效方法(或至少不是暴力破解)是什么?
一个简化的示例可能如下所示:
数组 = [6, 5, 7, 8, 6, 12, 16] 总和 = [14, 24, 22]
我想知道:
14 包括 8、6
24 包括 5、7、12
22 包括 6、16
function matchElements(arr, sums) {
var testArr;
function getSumHash() {
var hash = {},
i;
for (i = 0; i < sums.length; i++) {
hash[sums[i]] = [];
}
return hash;
}
sums = getSumHash();
// I don't have a good sense of where to start on what goes here...
return sumHash;
}
var totals = matchElements([6, 5, 7, 8, 6, 12, 16], [14,24,22]),
total;
for (total in totals) {
console.log(total + "includes", totals[total])
}
我知道总会有至少一个正确答案,我只需要检查数字,我不需要配对有重复的索引,只需配对与总数相关的值.是否有解决此类问题的既定功能?
这只是一个 javascript 问题,因为这是我编写解决方案所用的语言,这更像是一个通过 Javascript 过滤的一般数学相关问题。如果这不是适当的论坛,我欢迎重定向到适当的堆栈交换站点。
【问题讨论】:
-
虽然我可以使用你所说的“蛮力”,但我不知道有什么“快速”算法来实现它。
-
是的,我就是这么想的。我之所以这么说是因为我记得 xkcd 动画片中的一些刺拳,他告诉服务员在使用类似的问题时不要使用蛮力计算他的小费(我认为),这不是最好的理由哈哈......任何可以消除的东西都匹配元素会是首选,但我会满足于蛮力,我只是希望避免它。
-
roryhart.net/code/xkcd-np-complete-restaurant-order 这是解决问题的人,不幸的是我对Minizinc一无所知,显然它是用于“约束编程”中的建模问题。所以这很有趣,但没有帮助。
标签: javascript algorithm discrete-mathematics constraint-programming subset-sum