0416. 分割等和子集
最后更新于
这有帮助吗?
这有帮助吗?
令 target = sum / 2, nums 为输入数组, cur 为当前当前要选择的数字的索引
nums 为输入数组,target为当前求和目标,cur为当前判断的数
function dfs(nums, target, cur)
如果target < 0 或者 cur > nums.length
return false
否则
如果 target = 0, 说明找到答案了,返回true
否则
取当前数或者不取,进入递归 dfs(nums, target - nums[cur], cur + 1) || dfs(nums, target, cur + 1)var canPartition = function (nums) {
let sum = nums.reduce((acc, num) => acc + num, 0);
if (sum % 2) {
return false;
}
sum = sum / 2;
return dfs(nums, sum, 0);
};
function dfs(nums, target, cur) {
if (target < 0 || cur > nums.length) {
return false;
}
return (
target === 0 ||
dfs(nums, target - nums[cur], cur + 1) ||
dfs(nums, target, cur + 1)
);
}var canPartition = function (nums) {
let sum = nums.reduce((acc, num) => acc + num, 0);
if (sum % 2) {
return false;
}
sum = sum / 2;
nums = nums.sort((a, b) => b - a);
if (sum < nums[0]) {
return false;
}
return dfs(nums, sum, sum, 0);
};
function dfs(nums, pickRemain, discardRemain, cur) {
if (pickRemain === 0 || discardRemain === 0) {
return true;
}
if (pickRemain < 0 || discardRemain < 0 || cur > nums.length) {
return false;
}
return (
dfs(nums, pickRemain - nums[cur], discardRemain, cur + 1) ||
dfs(nums, pickRemain, discardRemain - nums[cur], cur + 1)
);
}n = nums.length
target 为 nums 各数之和
如果target不能被2整除,
返回false
令dp为n * target 的二维矩阵, 并初始为false
遍历0:n, dp[i][0] = true 表示前i个数组成和为0的可能
遍历 0 到 n
遍历 0 到 target
if 当前值j大于nums[i]
dp[i + 1][j] = dp[i][j-nums[i]] || dp[i][j]
else
dp[i+1][j] = dp[i][j]var canPartition = function (nums) {
let sum = nums.reduce((acc, num) => acc + num, 0);
if (sum % 2) {
return false;
} else {
sum = sum / 2;
}
const dp = Array.from(nums).map(() =>
Array.from({ length: sum + 1 }).fill(false)
);
for (let i = 0; i < nums.length; i++) {
dp[i][0] = true;
}
for (let i = 0; i < dp.length - 1; i++) {
for (let j = 0; j < dp[0].length; j++) {
dp[i + 1][j] =
j - nums[i] >= 0 ? dp[i][j] || dp[i][j - nums[i]] : dp[i][j];
}
}
return dp[nums.length - 1][sum];
};遍历 0 到 n
遍历 j 从 target 到 0
if 当前值j大于nums[i]
dp[j] = dp[j-nums[i]] || dp[j]
else
dp[j] = dp[j]var canPartition = function (nums) {
let sum = nums.reduce((acc, num) => acc + num, 0);
if (sum % 2) {
return false;
}
sum = sum / 2;
const dp = Array.from({ length: sum + 1 }).fill(false);
dp[0] = true;
for (let i = 0; i < nums.length; i++) {
for (let j = sum; j > 0; j--) {
dp[j] = dp[j] || (j - nums[i] >= 0 && dp[j - nums[i]]);
}
}
return dp[sum];
};F[i, v] = max{F[i-1, v], F[i-1, v-Ci] + Wi}F[i, v] = F[i-1, v] || F[i-1, v-Ci]/**
* @param {number} amount
* @param {number[]} coins
* @return {number}
*/
var change = function (amount, coins) {
const dp = Array.from({ length: amount + 1 }).fill(0);
dp[0] = 1;
for (let i = 0; i < coins.length; i++) {
for (let j = 1; j <= amount; j++) {
dp[j] = dp[j] + (j - coins[i] >= 0 ? dp[j - coins[i]] : 0);
}
}
return dp[amount];
};