Leetcode|01背包|416. 分割等和子集

在这里插入图片描述

动态规划(01背包问题)

dp数组含义】:容量(和)为j的情况下,能达到的最大容量(和)dp[j]
【状态转移方程】:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])

在这里插入图片描述

最后判断dp[halfSum]是否等于halfSum即可

class Solution {
    
    
public:
    bool canPartition(vector<int>& nums) {
    
    
        int size = nums.size();
        int sum = accumulate(nums.begin(), nums.end(), 0);
        if (sum % 2 != 0) return false;
        int halfSum = sum / 2;
        vector<int> dp(halfSum + 1, 0);
        for (int i = 0; i < size; i++)
            for (int j = halfSum; j >= nums[i]; j--)
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
        return dp[halfSum] == halfSum;
    }
};

dp数组含义】:容量(和)为j的情况下,能否恰好装满
【状态转移方程】:dp[j] = dp[j] || dp[j - nums[i]]

class Solution {
    
    
public:
    bool canPartition(vector<int>& nums) {
    
    
        int size = nums.size();
        int sum = accumulate(nums.begin(), nums.end(), 0);
        if (sum % 2 != 0) return false;
        sum /= 2;
        vector<bool> dp(sum + 1, false);
        dp[0] = true;
        for (int i = 0; i < size; i++)
            for (int j = sum; j >= nums[i]; j--) {
    
    
                dp[j] = dp[j] || dp[j - nums[i]];
            }
        return dp[sum];
    }
};

在这里插入图片描述

致谢

图片来源于「代码随想录」公众号,欢迎大家关注这位大佬的公号

猜你喜欢

转载自blog.csdn.net/SL_World/article/details/115030515