Leetcode416. 分割等和子集-代码随想录

目录

题目:

代码(首刷看解析 2024年2月23日:

代码(二刷看解析 2024年3月10日)

代码(三刷自解 2024年6月26日 go)


题目:

Leetcode416. 分割等和子集-代码随想录_第1张图片


代码(首刷看解析 2024年2月23日:

class Solution {
public:
    bool canPartition(vector& nums) {
        /*因为数值 < 100, length < 200 , 数值 < 20000*/
        vector dp(10001, 0);
        int sum = accumulate(nums.begin(), nums.end(), 0);

        if (sum % 2 == 1) return false;
        int target = sum / 2;

        for (int i = 0; i < nums.size(); ++i) {
            for (int j = target; j >= nums[i]; --j) {
                dp[j] = max(dp[j], (dp[j - nums[i]]) + nums[i]);
            }
        }
        if (dp[target] == target) return true;
        return false;
    }
};

代码(二刷看解析 2024年3月10日)

        01背包不知其所以然

class Solution {
public:
    bool canPartition(vector& nums) {
        int sum = accumulate(nums.begin(), nums.end(), 0);
        if (sum % 2 == 1) return false;
        int target = sum / 2;

        vector dp(target + 1, 0);
        for (int i = 0; i < nums.size(); ++i) {
            for (int j = target; j >= nums[i]; --j) {
                dp[j] = max(dp[j - nums[i]] + nums[i], dp[j]);
            }
        }
        return dp[target] == target;
    }
};

代码(三刷自解 2024年6月26日 go)

debug了几次debug对了,思路是没问题,就是小错误需要避免。go的小问题挺多,不知道cpp会不会好一点

func canPartition(nums []int) bool {
    // 两个数组分割和相等,如果和是奇数不可能
    var sum int
    for _,v := range nums {
        sum += v
    }
    if sum % 2 == 1 {
        return false
    }
    // 如果是偶数,则若存在一种分割方式使得 newSum == sum / 2,则true,否则false
    // 01背包: 背包总量w = sum / 2, 物品数量 = len(nums), 单个物品价值 == 单个物品重量 == nums[i]
    // dp[i][j] 表示0~i个物品,总量为w存不存在一种刚刚好的方式 则 dp[i][j] = dp[i - 1][j] or dp[i - 1][j - num[i]] + nums[i]
    dp := make([][]int, len(nums) + 1)
    for k := range dp {
        dp[k] = make([]int, sum / 2 + 1)
    }
    for i := 1; i < len(nums); i++ {
        for j := 0; j <= sum / 2; j++ {
            if j < nums[i] {
                dp[i][j] = dp[i - 1][j]
            } else {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i])
            }
        }
    }
    return dp[len(nums) - 1][sum/2] == sum/2
}

你可能感兴趣的:(#,leetcode,---medium,算法,leetcode,动态规划)