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];
}
}

浙公网安备 33010602011771号