给定一个只包含正整数非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
    注意:

    1. 每个数组中的元素不会超过 100
    2. 数组的大小不会超过 200

    示例 1:

    1. 输入: [1, 5, 11, 5]
    2. 输出: true
    3. 解释: 数组可以分割成 [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];
    
        }
    };