分割等和子集 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;}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~