分割等和子集 Java
·

class Solution {
public boolean canPartition(int[] nums) {
int n = nums.length;
if (n <= 1) return false;
int sum = 0;
for (int i = 0; i < n; i++) {
sum += nums[i];
}
if (sum % 2 != 0) return false; // 总和为奇数一定找不到相等的两个子集和
int target = sum / 2; // 分为两个子集,则每个子集之和最高为总和一半
int[] dp = new int[target + 1];
for (int i = 0; i < n; i++) {
for (int j = target; j >= nums[i]; j--) { // 倒序遍历防止重复计算
dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]); // 01背包
}
}
return dp[target] == target;
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
更多推荐


所有评论(0)