刚听完y总的课 学习一下0-1背包
优化好难理解 呜呜呜
练习一下
class Solution {
public boolean canPartition(int[] nums) {
int n = nums.length;
if(n < 2) return false;
int sum = 0;
int max = 0;
for(int i = 0; i < n; i ++){
sum += nums[i];
max = Math.max(max, nums[i]);
}
if(sum % 2 != 0) return false;
int half = sum / 2;
if(max > half) return false;
boolean[][] dp = new boolean[n][half + 1];
dp[0][nums[0]] = true;
for(int i = 1; i < n; i ++){
for(int j = 1; j <= half; j ++){
if(j >= nums[i]){
dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]];
}else{
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n - 1][half];
}
}
class Solution {
public boolean canPartition(int[] nums) {
int n = nums.length;
if(n < 2) return false;
int sum = 0;
int max = 0;
for(int i = 0; i < n; i ++){
sum += nums[i];
max = Math.max(max, nums[i]);
}
if(sum % 2 != 0) return false;
int half = sum / 2;
if(max > half) return false;
boolean[] dp = new boolean[half + 1];
dp[0] = true;
for(int i = 1; i < n; i ++){
for(int j = half; nums[i]<= j; j --){
if (dp[half]) {
return true;
}
dp[j] = dp[j] || dp[j - nums[i]];
}
}
return dp[half];
}
}