https://leetcode.com/problems/partition-equal-subset-sum/
找是否有子数组之和为sum / 2。两层循环,外层循环nums,内层循环sum。当不包括nums[i]情况下存在子数组和为j时,则子数组和可能为nums[i] + j。
public class Solution {
public boolean canPartition(int[] nums) {
int sum = 0;
for (int num : nums) {
sum += num;
}
if (sum % 2 != 0) {
return false;
}
boolean[] dp = new boolean[sum + 1];
for (int i = 0; i < nums.length; i++) {
// 如果正向遍历,nums[i] 可能在一次 j 循环中被多次使用
// eg: dp[2 + 10] = dp[2 + 10] | dp[10] = dp[2 + 10] | dp[2 + 8]
for (int j = sum - nums[i]; j >= 0; j--) {
dp[nums[i] + j] |= dp[j];
}
dp[nums[i]] = true;
}
return dp[sum / 2];
}
}