经典01背包问题
如果通过暴力做法,每个值都有两种选择,通过二进制枚举,时间复杂度太大为2的200次方
当数组每个值都有两种选择时,我们都可以套用01背包模板,两种选择对于选与不选。
还有一种题型,对于数组每个数,都可以选择+或-,如何选使得总和为0
/**
* @param {number[]} nums
* @return {boolean}
*/
var canPartition = function(nums) {
let sum = 0;
for (let i of nums)
sum += i;
if (sum % 2) return false;
sum /= 2;
let f = new Array(sum + 1).fill(0);
f[0] = 1;
for (let i of nums) {
for (let j = sum; j >= i; j --) {
f[j] |= f[j - i];
}
}
return f[sum];
};