这个是01背包问题。一定要复习啊。
class Solution {
public boolean canPartition(int[] nums) {
int sum = 0;
for(int i = 0; i < nums.length; ++i){
sum += nums[i];
}
if (sum % 2 == 1) return false;
int[] dp = new int[sum/2 +1];
int target = sum/2;
for(int i = 0; i < nums.length; ++i){
for(int j = target; j >= nums[i]; --j){
dp[j] = Math.max(dp[j-nums[i]] + nums[i], dp[j]);
}
}
return dp[target] == target;
}
}
class Solution {
public int lastStoneWeightII(int[] stones) {
int sum = 0;
for(int stone: stones){
sum += stone;
}
int target = sum/2;
int[] dp = new int[target+1];
for(int i = 0; i < stones.length; ++i){
for(int j = target; j >= stones[i]; --j){
dp[j] = Math.max(dp[j], dp[j-stones[i]] + stones[i]);
}
}
return sum - dp[target] - dp[target];
}
}
507





