#416. Partition Equal Subset Sum 题目链接
public class Solution {
/*
转化为01背包问题
*/
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 target = sum / 2;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > target) {
return false;
} else if (nums[i] == target) {
return true;
}
}
// 如果仍无法判断,转化为01背包问题
int len = nums.length;
boolean[][] dp = new boolean[len + 1][target + 1];
for (int i = 0; i < dp.length; i++) {
Arrays.fill(dp[i], false);
}
for (int i = 0; i < len + 1; i++) {
dp[i][0] = true;
}
for (int i = 1; i < len + 1; i++) {
for (int j = 1; j < target + 1; j++) {
dp[i][j] = dp[i - 1][j];
if (j >= nums[i - 1]) {
dp[i][j] = dp[i][j] || dp[i - 1][j - nums[i - 1]];
}
}
}
return dp[len][target];
}
}
另外一个降低了空间复杂度的01背包方案
public class Solution {
/*
转化为01背包问题
*/
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 target = sum / 2;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > target) {
return false;
} else if (nums[i] == target) {
return true;
}
}
// 如果仍无法判断,转化为01背包问题
int len = nums.length;
boolean[] dp = new boolean[target + 1];
Arrays.fill(dp, false);
dp[0] = true;
for (int i = 1; i < len + 1; i++) {
// 注意这里的方向是从后向前
for (int j = target; j > 0; j--) {
if (j >= nums[i - 1]) {
dp[j] = dp[j] || dp[j - nums[i - 1]];
}
}
}
return dp[target];
}
}