给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
- 每个数组中的元素不会超过 100
 - 数组的大小不会超过 200
 
示例 1:
输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].
 
示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for(int num:nums){
            sum += num;
        }
        if(sum % 2 == 1)
            return false;
        return subsets(nums, sum / 2);
    }
    bool subsets(vector<int>& nums, int target){
        vector<vector<bool>> dp(nums.size() + 1, vector<bool>(target + 1, false));
        for(int i = 0; i<nums.size(); i++){
            dp[i][0] = true;
        }
        for(int i = 1; i<=nums.size(); i++){
            for(int j = 1;j<=target;j++){
                // if(dp[i-1][j]== true){
                //     dp[i][j] = true;
                // }else if(j - nums[i - 1] >= 0 && dp[i-1][j - nums[i - 1]]== true){
                //     dp[i][j] = true;
                // }else{
                //     dp[i][j] = false;;
                // }
                if(j - nums[i - 1] < 0){
                    dp[i][j] = dp[i-1][j];
                }else{
                    dp[i][j] = dp[i-1][j] | dp[i-1][j - nums[i - 1]];
                }
            }
        }
        return dp[nums.size()][target];
    }
};
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for(int num:nums){
            sum += num;
        }
        if(sum % 2 == 1)
            return false;
        return subsets(nums, sum / 2);
    }
    bool subsets(vector<int>& nums, int target){
        vector<bool> dp(target + 1, false);
        for(int i = 0; i<nums.size(); i++){
            dp[0] = true;
        }
        for(int i = 1; i<=nums.size(); i++){
            for(int j = target;j>=0;j--){
                if(j - nums[i - 1] < 0){
                    dp[j] = dp[j];
                }else{
                    dp[j] = dp[j] | dp[j - nums[i - 1]];
                }
            }
        }
        return dp[target];
    }
};
                    