下面的代码是关于使用子集零和算法的动态规划。
换句话说,它告知在添加元素时有多少子集总和为零。
但是,如果集合为 [2, -2],结果将为 2,因为有两个总和为零的子集:{}(空集)和 {2, -2}。
但是如果我们将集合更改为 [2, 2],结果仍然是 2。
这是什么解释,对我来说应该是1?
JavaScript 代码取自网站 geeksforgeeks
const arr = [2, 2];
const n = arr.length;
const maxSum = 3;
const dp = new Array(n + 1);
for (let i = 0; i <= n; i++) {
dp[i] = new Array(2 * maxSum + 1).fill(0);
}
for (let i = 0; i <= n; i++) {
dp[i][maxSum] = 1;
}
for (let i = 1; i <= 2 * maxSum; i++) {
dp[0][i] = 0;
}
for (let i = 1; i <= n; i++) {
for (let j = -maxSum; j <= maxSum; j++) {
const val = arr[i - 1];
if (j - val + maxSum >= 0 && j - val + maxSum <= 2 * maxSum) {
dp[i][j + maxSum] += dp[i - 1][j - val + maxSum];
}
if (j + maxSum >= 0 && j + maxSum <= 2 * maxSum) {
dp[i][j + maxSum] += dp[i - 1][j + maxSum];
}
}
}
console.log(dp)
console.log(dp[n][maxSum])
动态规划-DP
我在问题中发布的代码不适用于 DP - Tabulation,它仅适用于 Memoization,可在网站 geeksforgeeks 上找到。如果答案大于 1,则意味着存在一个总和为零的子集,但它不适用于浮点数。
但是,我设法创建了决策代码来确定该集合是否有等于零的总和,并且它是使用 DP - 制表来实现的。
该代码适用于负整数和浮点数。
function subsetSumZero() {
const list = [-10, 100, -13579.1, -4, 13589.1];
let sum = [];
if (sum.length === 0) {
sum.push(list[0]);
}
for (let i = 1; i < list.length; i++) {
sum.push(list[i]);
let temp = [];
for (let j = 0; j < sum.length - 1; j++) {
let summation = sum[j] + list[i];
if (summation === 0) {
return true;
}
temp.push(summation);
}
sum.push(...temp);
}
return false;
}