题目链接:分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

方法一:动态规划+二维数组

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        vector dp(nums.size() + 1, vector<int> (2e4 + 10, 0));
        double sum = 0;
        for (auto x : nums) {
            sum += x;
        }
        double target = sum / 2;
        for (int i = 0;i < nums.size();i++) {
            for (int j = 0;j <= target;j++) {
                if (j < nums[i]) {
                    dp[i+1][j] = dp[i][j];
                }else 
                    dp[i + 1][j] = max(dp[i][j], dp[i][j - nums[i]] + nums[i]);
            }
        }
        return dp[nums.size()][target] == target;
    }
};

方法二:动态规划+一维数组

//一维优化
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        vector<int> dp(2e4 + 10, 0);
        double sum = 0;
        for(int i = 0;i < nums.size(); ++i)
            sum += nums[i];
        double target = double(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]);
        
        return dp[target] == target;
    }
};

标签: hot100, Medium, 动态规划

添加新评论