416. 分割等和子集 - 力扣(LeetCode)
class Solution {
public boolean canPartition(int[] nums) {
int sum = 0;
for (int i=0;i<nums.length;i++){
sum += nums[i];
}
if(sum%2!=0){
return false;
}
int weight = sum /2;
// int[][] dp = new int[nums.length][weight+1];
// for(int i=0;i<=weight;i++){
// if(i >= nums[0]){
// dp[0][i] = nums[0];
// }
// }
// for(int i=1;i<nums.length;i++){
// for (int j=1;j<=weight;j++){
// if(j > nums[i]){
// dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-nums[i]] + nums[i]);
// }else{
// dp[i][j] = dp[i-1][j];
// }
// }
// }
// return dp[nums.length-1][weight] == weight;
int[] dp = new int[weight+1];
for(int j=0;j<=weight;j++){
if(j >= nums[0]){
dp[j] = nums[0];
}
}
for(int i=1;i<nums.length;i++){
for(int j=weight;j>=nums[i];j--){
dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);
}
}
return dp[weight] == weight;
}
}