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.