Javascript 组合是这个难题的解决方案吗?

Javascript 组合是这个难题的解决方案吗?,javascript,combinations,Javascript,Combinations,下面是Coderbyte“简单”部分的练习 让函数ArrayAdditionI(arr)获取数字数组,如果数组中的任何数字组合相加等于数组中的最大数字,则返回“true”,否则返回“false”。 例如:如果arr包含[4,6,23,10,1,3],则输出应返回true,因为4+6+10+3=23。 我可以想象一个交互式的解决方案,但复杂性让我充满恐惧。 我需要学习什么来解决这个问题 我在读组合函数C(n,k)。这是正确的路径吗?我认为这是1d垃圾箱包装或背包问题。这个问题也是一个决策问题,所以

下面是Coderbyte“简单”部分的练习

让函数ArrayAdditionI(arr)获取数字数组,如果数组中的任何数字组合相加等于数组中的最大数字,则返回“true”,否则返回“false”。 例如:如果arr包含[4,6,23,10,1,3],则输出应返回true,因为4+6+10+3=23。

我可以想象一个交互式的解决方案,但复杂性让我充满恐惧。 我需要学习什么来解决这个问题


我在读组合函数C(n,k)。这是正确的路径吗?

我认为这是1d垃圾箱包装或背包问题。这个问题也是一个决策问题,所以它是一个np问题。这可能是一个弱多项式问题。

也许有一个非常简单的解决方案:

arrAddition=函数(值){
//从最大的排序
值。排序(函数(a,b){
返回b-a;
}); 
var总和=0;
//从第二个开始,添加,直到达到极限
对于(变量i=1;i值[0]){
//不要再往前走了
返回false;
}
}
//要么失败。
返回错误
}
使用方便的方法(如reduce)甚至更短


但我可能完全误解了这个问题……

这应该有助于观看斯坦福大学的讲座。只是想确定他们肯定会申请。Thx.yeh我相信跳过某些组合实际上,它只找到一个组合!但这正是你所要求的:是否存在组合。优点是它非常快:一次通过排序,另一次通过查找解决方案。在乐观的情况下,你可以停止第三个元素!复杂性:O(n)如果一个组合也超过它,则返回true。在示例中,所有剩余的元素加起来正好等于最大的元素,但不超过最大的元素。它不适用于以下情况:10、9、8。它应该返回false,因为9+8超过10,但将返回true。您可以将>=更改为==但需要添加额外的逻辑,以允许没有顺序组合。例如10、6、5、4。将6和5相加将导致其超过10并失败,但这组数字应返回true(6+4)。好的开始,你说得很对,西蒙!这是我第一次想到更高或相等。现在更复杂了:)
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
}