1. 程式人生 > 其它 >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];


    }
}