以下是Coderbyte“简单”部分的练习。
让函数ArrayAdditionI(arr)获取数字数组并返回“true”,如果数组中的任何数字组合可以添加到数组中的最大数字,否则返回“false”。 例如:如果arr包含[4,6,23,10,1,3],则输出应返回true,因为4 + 6 + 10 + 3 = 23.
我可以想象一个解决这个问题的互动解决方案,但复杂性使我感到恐惧。 我需要学习什么来解决这个问题?
我正在阅读组合功能C(n,k)。这是正确的道路吗?
答案 0 :(得分:0)
我认为这是一个垃圾箱或一个knappsack问题。这个问题也是一个决策问题所以这是一个问题。它可能是一个弱多项式问题。
答案 1 :(得分:-1)
或许有一种非常天真的解决方案:
arrAddition = function(values) {
// sort from largest
values.sort(function(a, b) {
return b-a;
});
var sum = 0;
// starts from second, and add until reaching the limit
for (var i = 1; i < values.length; i++) {
sum += values[i];
if (sum == values[0]) {
return true;
} else if (sum > values[0]) {
// don't go further
return false;
}
}
// or fail.
return false
}
使用Underscore方便的方法(比如reduce)更短。
但我可能完全误解了这个问题......