Reduction
Total sum must be even. Then find subset summing to total/2. Standard subset-sum DP.
Advertisement
2D DP
boolean[][] dp = new boolean[n+1][target+1];
for (int i = 0; i <= n; i++) dp[i][0] = true;
for (int i = 1; i <= n; i++)
for (int s = 1; s <= target; s++) {
dp[i][s] = dp[i-1][s];
if (s >= nums[i-1]) dp[i][s] |= dp[i-1][s - nums[i-1]];
}
return dp[n][target];Advertisement
1D optimization
boolean[] dp = new boolean[target + 1];
dp[0] = true;
for (int x : nums)
for (int s = target; s >= x; s--)
dp[s] |= dp[s - x];
return dp[target];Why iterate in reverse
1D DP: iterate sum backward so we don't use same item twice within one row update.