416. 分割等和子集

时间:2021-07-25
本文章向大家介绍416. 分割等和子集,主要包括416. 分割等和子集使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

0-1背包问题类似

二维dp:

class Solution {
    public boolean canPartition(int[] nums) {
   int sum=0;
   for(int num:nums){
       sum+=num;
   }
   if(sum%2!=0)return false;

   int target =sum/2;
   boolean[][] dp=new boolean[nums.length][target+1];
   //dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]]

   for(int j=0;j<target+1;j++){
       if(nums[0]==j)
            dp[0][j]=true;
   }
   for(int i=1;i<nums.length;i++){
       for(int j=0;j<target+1;j++){
           dp[i][j]=dp[i-1][j];
           if(j-nums[i]>0)
              dp[i][j]=dp[i-1][j-nums[i]]||dp[i][j];
           if(j==nums[i])
              dp[i][j]=true;
       }
   }
   return dp[nums.length-1][target];


    }
}

一维dp(注意是逆序更新):

class Solution {
    public boolean canPartition(int[] nums) {
   int sum=0;
   for(int num:nums){
       sum+=num;
   }
   if(sum%2!=0)return false;

   int target =sum/2;
   boolean[]dp=new boolean[target+1];
   //dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i]]

   for(int j=0;j<target+1;j++){
       if(nums[0]==j)
            dp[j]=true;
   }
    for(int i=1;i<nums.length;i++){
        for(int j=target;j>=0;j--){
            if(j>nums[i])
            dp[j]=dp[j]||dp[j-nums[i]];
            if(j==nums[i])
            dp[j]=true;
        }
    }
   
   return dp[target];


    }
}

原文地址:https://www.cnblogs.com/wsshub/p/15057284.html