class Solution {
public:
int target = 0;
void DFS(vector<int>& nums, int sum, int i, int size, int goal) {
if (i < size) {
DFS(nums, sum + nums[i], i + 1, size, goal);
DFS(nums, sum - nums[i], i + 1, size, goal);
} else {
if (sum == goal) {
++target;
}
}
}
int findTargetSumWays(vector<int>& nums, int S) {
DFS(nums, 0, 0, nums.size(), S);
return target;
}
};
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int sum = 0;
for (int i : nums) {
sum += i;
}
int target = sum - S;
if (target < 0 || target % 2 == 1)
return0;
target /= 2;
vector<int> total(target + 1, 0);
total[0] = 1;
for (int i : nums) {
for (int t = target; t >= 0; --t) {
if (t >= i) {
total[t] += total[t-i];
}
}
}
return total[target];
}
};