416. 分割等和子集
阿新 • • 發佈:2021-07-25
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]; } }