416. 分割等和子集

由于算法老师和自己太给力了,01背包问题一直一知半解,这次遇见经典背包动态规划都不会

然后在看了题解出现了很多问题,由于不方便调试,所以就硬看,特别痛苦

查看代码
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum=0;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++){
            sum+=nums[i];
        }
        int target = sum/2;
        if(sum%2==1||nums[nums.size()-1]>target){
            return false;
        }
        vector<vector<bool>>temp(nums.size(),vector<bool>(target+1,false));
       for(int i=0;i<nums.size();i++){
           temp[i][0]=true;
       }
        for(int i=1;i<nums.size();i++){
            for(int j =1;j<=target; j++){
                if(j<nums[i]){
                    if(i==0){
                        continue;
                    }
                    else{
                        temp[i][j] = temp[i-1][j];
                    }
                }
                else{
                   
                    if(i==0){
                        temp[i][j] = temp[i][j-nums[i]];
                    }
                    else{
                        temp[i][j]=temp[i-1][j]||temp[i-1][j-nums[i]];
                    }
                }
               
            }
             if(temp[i][target]==true){
                    return true;
                }
        }
        temp[nums.size()-1][target+10]=false;
        return false;
    }
};

然后就是没看题解出错的代码

查看代码
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum=0;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++){
            sum+=nums[i];
        }
        int target = sum/2;
        if(sum%2==1||nums[nums.size()-1]>target){
            return false;
        }
        vector<vector<bool>>temp(nums.size(),vector<bool>(target+1,false));
        temp[0][0]=true;
        for(int i=1;i<nums.size();i++){
            for(int j =1;j<=target; j++){
                if(j<nums[i]){
                    if(i==0){
                        continue;
                    }
                    else{
                        temp[i][j] = temp[i-1][j];
                    }
                }
                else{
                   
                    if(i==0){
                        temp[i][j] = temp[i][j-nums[i]];
                    }
                    else{
                        temp[i][j]=temp[i-1][j]||temp[i-1][j-nums[i]];
                    }
                }
               
            }
             if(temp[i][target]==true){
                    return true;
                }
        }
        temp[nums.size()-1][target+10]=false;
        return false;
    }
};
posted @ 2022-01-01 20:59  jozon  阅读(43)  评论(0)    收藏  举报