我正在编写一种算法,该算法可以查找包含唯一值的数组中可能的总和数,以及第二个包含第一个数组中每个相应值的数量的数组。例如,对[10, 20, 50] and [1, 2, 1]
表示我合并的元素总数实际为[10, 20, 20, 50]
,因为有两个数字20的实例。
我的算法目前正在通过除了一个以外的所有测试,我不能为我的生活找出原因,因为它传递了其他更复杂的配对。这是我到目前为止的算法:
function possibleSums(values, quantity) {
const sums = new Set([]);
//my recursive function that finds all possible combinations moving
//down from a specific starting index in the valueArrray:
const combinations = (valueArray, countArray, position, currentSum) => {
if (currentSum > 0) sums.add(currentSum);
for(let i = position; i < valueArray.length; i++){
if (countArray[i] === 0){
continue;
}
currentSum += valueArray[i];
//reduce the count of that value that is still available
countArray[i]--;
//send off a recursive call to find the sum with the next
//available value
combinations(valueArray, countArray, i, currentSum);
//return the original count since `i` is increasing past
//the current value's location in the valueArray
countArray[i]++;
}
}
for (let i = 0; i < values.length; i++){
//start the recursive function calls at each index in the value array
combinations(values, quantity, i, 0)
}
return sums.size
}
此算法传递数组对,如:
[3, 1, 1] and [111, 84, 104]
,预期输出为521
[1, 1, 1, 1, 1] and [9, 19, 18, 12, 19]
,预期输出为77
[1, 2, 3] and [2, 3, 10000]
预期输出为30008
但是失败了
[10, 50, 100, 500] and [5, 3, 2, 2]
,当预期输出为122
有人能发现我逻辑中缺少的东西吗?
答案 0 :(得分:1)
122预期输出对于记录来说不是太大的测试用例:)
让我们记录参数:
...
const combinations = (valueArray, countArray, position, currentSum) => {
console.log(countArray, position, currentSum)
if (currentSum...
我们看到了这一点,这是有道理的:
[ 0, 0, 0, 0 ] 3 1400
但是我们也看到了:
[ 0, 0, 1, 0 ] 3 1400
[ 0, 1, 0, 0 ] 3 1400
...
[ 1, 1, 1, 0 ] 3 1400
哪个没有。
在迭代期间更改当前参数似乎在其他调用期间影响变量。
更改
currentSum += valueArray[i];
...
combinations(valueArray, countArray, i, currentSum);
到
//currentSum += valueArray[i];
...
combinations(valueArray, countArray, i, currentSum + valueArray[i]);
似乎可以解决问题。