var canPartition = (nums) => {
const sum = getSum(nums);
const subSetSum = (sum / 2);
const isEven = ((sum % 2) === 0);
if (!isEven) return false;
const index = (nums.length - 1);
return dfs(nums, index, subSetSum);
}
var getSum = (nums, sum = 0) => {
for (const num of nums) (sum += num);
return sum;
}
var dfs = (nums, index, subSetSum) => {
const isBaseCase1 = subSetSum === 0;
if (isBaseCase1) return true;
const isBaseCase2 = (index === 0) || (subSetSum < 0);
if (isBaseCase2) return false;
const difference = (subSetSum - nums[(index - 1)]);
const left = dfs(nums, (index - 1), difference);
const right = dfs(nums, (index - 1), subSetSum);
return (left || right);
}
var canPartition = (nums) => {
const isEmpty = nums.length === 0;
if (isEmpty) return false;
const sum = getSum(nums);
const isEven = ((sum % 2) === 0);
if (!isEven) return false;
const subSetSum = (sum >> 1);
const memo = initMemo(nums, subSetSum);
const index = (nums.length - 1);
return dfs(nums, index, subSetSum, memo);
}
var initMemo = (nums, subSetSum) => new Array((nums.length + 1)).fill()
.map(() => new Array((subSetSum + 1)).fill(null));
var dfs = (nums, index, subSetSum, memo) => {
const isBaseCase1 = (subSetSum === 0);
if (isBaseCase1) return true;
const isBaseCase2 = ((index === 0) || (subSetSum < 0));
if (isBaseCase2) return false;
const hasSeen = (memo[index][subSetSum] !== null);
if (hasSeen) return memo[index][subSetSum];
const difference = (subSetSum - nums[(index - 1)]);
const left = dfs(nums, (index - 1), difference, memo);
const right = dfs(nums, (index - 1), subSetSum, memo);
memo[index][subSetSum] = (left || right);
return memo[index][subSetSum];
}
var canPartition = (nums) => {
const isEmpty = nums.length === 0;
if (isEmpty) return false;
const sum = getSum(nums);
const isEven = ((sum % 2) === 0);
if (!isEven) return false;
const subSetSum = (sum >> 1);
const tabu = initTabu(nums, subSetSum);
search(nums, subSetSum, tabu);
return tabu[nums.length][subSetSum];
}
var getSum = (nums, sum = 0) => {
for (const num of nums) { sum += num };
return sum;
}
var initTabu = (nums, subSetSum) => {
const tabu = new Array((nums.length + 1)).fill()
.map(() => new Array((subSetSum + 1)).fill(false));
tabu[0][0] = true;
return tabu;
}
var search = (nums, subSetSum, tabu) => {
for (let numIndex = 1; (numIndex <= nums.length); numIndex++) {
update(nums, numIndex, subSetSum, tabu);
}
}
var update = (nums, numIndex, subSetSum, tabu) => {
const num = (numIndex - 1);
const prevNum = nums[num];
for (let subSet = 0; subSet <= subSetSum; subSet++) {
const isNumGreater = (subSet < prevNum);
tabu[numIndex][subSet] = isNumGreater
? (tabu[num][subSet])
: ((tabu[num][subSet]) || (tabu[num][subSet - prevNum]));
}
}
var canPartition = (nums) => {
const isEmpty = nums.length === 0;
if (isEmpty) return false;
const sum = getSum(nums);
const isEven = ((sum % 2) === 0);
if (!isEven) return false;
const subSetSum = (sum >> 1);
const tabu = initTabu(subSetSum);
search(nums, subSetSum, tabu);
return tabu[subSetSum];
};
var getSum = (nums, sum = 0) => {
for (const num of nums) { sum += num };
return sum;
}
var initTabu = (subSetSum) => {
const tabu = new Array((subSetSum + 1)).fill(false);
tabu[0] = true;
return tabu;
}
var search = (nums, subSetSum, tabu) => {
for (const num of nums) {
update(num, subSetSum, tabu);
}
}
var update = (num, subSetSum, tabu) => {
for (let subSet = subSetSum; (num <= subSet); subSet--) {
const difference = (subSet - num);
tabu[subSet] |= tabu[difference];
}
}