๋ฌธ์
ํ์ด ๊ณผ์
์ฃผ์ด์ง ๋ฐฐ์ด์์ ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋์์ ๋ ๋ ๊ทธ๋ฃน์ ํฉ์ด ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋์ง ์ฐพ๋ ๋ฌธ์ ์
๋๋ค. 0-1 knapsack
๋ฌธ์ ์ ๋น์ทํ๊ฒ ํน์ ์ธ๋ฑ์ค์ ์ซ์๋ฅผ ์ ํํ ์ง ์ํ ์ง๋ฅผ ๋ฐ์ ธ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ๋ฉ๋๋ค.
์ฐ์ ๋ชฉํ ํฉ target = total / 2
์ด๋ฉฐ ๋๋์ด ๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๋ ํด๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์ด๋ฅผ ๋ฐ๋ก ์์ธ์ฒ๋ฆฌํฉ๋๋ค.
๊ทธ ๋ค์ dp[i, k] = i ์ดํ ์ซ์๋ค์ ์ ํํด์ ํฉ์ด k ๊ฐ ๋๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋์ง
๋ผ๊ณ ์ ์ํ๋ค๋ฉด
๋ค์๊ณผ ๊ฐ์ ์ ํ์์ ์ป์ ์ ์์ต๋๋ค.
dp[i, k] = dp[i+1, k-num[i]] or dp[i+1, k]
์ฝ๋
/**
* @param {number[]} nums
* @return {boolean}
*/
var canPartition = function (nums) {
const acc = nums.reduce((acc, n) => acc + n);
if (acc % 2) return false;
const target = acc / 2;
const memo = new Array(nums.length + 1)
.fill(0)
.map((_) => new Array(target + 1).fill(-1));
function dp(i, k) {
if (k === 0) return 1;
else if (i + 1 >= nums.length || k < 0) return 0;
if (memo[i + 1][k] !== -1) return memo[i + 1][k];
memo[i + 1][k] = dp(i + 1, k - nums[i]) || dp(i + 1, k);
return memo[i + 1][k];
}
nums.unshift(0);
const answer = dp(-1, target);
return answer;
};
๋ฐ์ํ
'๐ algorithm > leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
LeetCode 309 - Best Time to Buy and Sell Stock with Cooldown (Medium) (0) | 2021.03.04 |
---|---|
LeetCode 75 - Sort Colors (Medium) (0) | 2021.03.04 |
LeetCode 560 - Subarray Sum Equals K (Medium) (2) | 2021.03.04 |
LeetCode 752 - Open the Lock (Medium) (0) | 2021.03.04 |
LeetCode 11 - Container With Most Water (Medium) (0) | 2021.03.04 |
๐ฌ ๋๊ธ