解题思路:
01背包问题
拆分为left和right两部分集合(left表示正,right表示负)
left + right = sum;
left - right = target;
推导出 left =(sum + target)/ 2
只需要知道有没有数字可以填满left即可
class Solution {
public int findTargetSumWays(int[] nums, int target) {
int sum = 0;
for (int num : nums) {
sum += num;
}
if (Math.abs(target) > sum) return 0;
if ((sum + target) % 2 != 0) return 0;
int left = (sum + target) / 2;
int[] dp = new int[left + 1];
dp[0] = 1;
for (int i = 0; i < nums.length; i++) {
for (int j = left; j >= nums[i]; j--) {
dp[j] += dp[j - nums[i]];
}
}
return dp[left];
}
}