【发布时间】:2019-05-08 14:34:38
【问题描述】:
子集总和问题是创建一个算法的问题,该算法接受一个数组和总和,并返回参数数组的所有子集,其总和等于给定总和。我正在尝试解决各种子集总和问题(使用 JavaScript),其中只允许非负整数,并且返回总和等于传入总和的所有子集。
我遵循动态编程方法来解决问题,并创建了一个函数,该函数返回一个二维布尔数组,该数组显示参数数组的哪些子集与参数相加。每行代表参数数组中的一个数字(第一行代表第一个元素,第二行代表第二个元素,以此类推);并且每一列代表一个sum的值(最左边的列代表sum = 0,最右边的列代表sum = "argument sum")。如果元素subsetArray[r][c] == true,则子集{array[0], array[1], ..., array[r]} 的元素总和为“c”。
const subsetSum = (array, sum) => {
// Initialize empty 2D boolean array.
let subsetArray = new Array(array.length)
.fill(false)
.map(() => new Array(sum + 1).fill(false));
for (let e = 0; e < array.length; e++) {
for (let s = 0; s <= sum; s++) {
if (s === 0 || s === array[e]) {
subsetArray[e][s] = true;
continue;
}
if (e > 0) {
if (
subsetArray[e - 1][s] === true ||
subsetArray[e - 1][s - array[e]] === true
) {
subsetArray[e][s] = true;
}
}
}
}
return subsetArray;
};
备注: 此功能不能解决问题。它只提供保证包含总和等于指定总和的子集的子集。
我的问题是我需要从这个布尔数组中提取总和等于指定总和的实际子集。我尝试过这样做,但我的方法中的逻辑(包括使用布尔数组来减少我必须分析的子集的数量)变得相当复杂,我很难实现它。
当一个人拥有subsetSum 生成的布尔数组时,有没有人知道找到总和等于给定总和的所有子集的好方法?
编辑 1
输入
Sum: 17
Array 7 2 1 5 1 20 7
输出
7 7 2 1
【问题讨论】:
-
你有输入和想要输出的例子吗?
-
我添加了一个输入/输出示例。
标签: javascript subset-sum