leetcode 416. 分割等和子集 经典01背包问题

118 阅读1分钟

经典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];
};