leetcode-416. 分割等和子集

 

 

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int n = nums.size();

        if(n<=1)  // 数组长度小于等于1返回false
            return false;
            int sum = 0;
        for(int i = 0; i < n; i++)
            sum = sum + nums[i];
        int res = sum%2;
        if(res==1)  // 奇数返回false
            return false;

        int target = sum/2;
        sort(nums.begin(), nums.end());
        if(nums[n-1]>target)  // 最大值大于数组和的一半,返回false
            return false;

        vector<vector<bool>> dp(n, vector<bool> (target+1, false)); 
        //长度为target+1,和才能为target
        //dp[i][j] 表示从数组的 [0,i] 下标范围内选取若干个正整数(可以是 0 个)
        //是否存在一种选取方案使得被选取的正整数的和等于 j

        for(int i = 0; i < n; i++)
            dp[i][0] = true;  // 从0~i下标范围内选择若干个元素使得其和为0 肯定可以,不选嘛

        dp[0][nums[0]] = true;  // 从下标0选择元素使其和为nums[0] 肯定可以,就选nums[0];

        for(int i = 1; i < n; i++){
            for(int j = 1; j <= target; j++){
                if(j>=nums[i]){
                    dp[i][j] = dp[i-1][j]||dp[i-1][j-nums[i]];
                }
                else{
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[n-1][target];
        
    }
};

 

posted @ 2021-07-28 15:01  三一一一317  阅读(39)  评论(0)    收藏  举报