LeetCode—— Partition Equal Subset Sum

Question

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

Note:
Each of the array element will not exceed 100.
The array size will not exceed 200.
Example 1:

Input: [1, 5, 11, 5]

Output: true

Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:

Input: [1, 2, 3, 5]

Output: false

Explanation: The array cannot be partitioned into equal sum subsets.

Solution

动态规划,这其实是一个0-1背包问题,dp[i][j],i表示用第0~i个数是否可以组成值为j,dp[0][0] = true.

Code

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int total = accumulate(nums.begin(), nums.end(), 0), target = total >> 1;
        vector<vector<bool> > dp(nums.size() + 1, vector<bool>(target + 1, false));
        if (total & 1)
            return false;
        
        for (int j = 0; j <= nums.size(); j++) {
            dp[j][0] = true;
        }
        for (int i = 1; i <= target; i++)
            dp[0][i] = false;
        
        
        for (int i = 1; i <= nums.size(); i++) {
            for (int j = 1; j <= target; j++) {
                dp[i][j] = dp[i - 1][j];
                if (j >= nums[i - 1])
                    dp[i][j] = dp[i][j] || dp[i - 1][j - nums[i - 1]];
            }
        }
        return dp[nums.size()][target];
    }
};
原文地址:https://www.cnblogs.com/zhonghuasong/p/7517353.html