动态规划
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int n = nums.size();
int sum = 0;
for (int i = 0; i < n; i++)
sum += nums[i];
if ((sum - target) % 2 != 0 || (sum - target < 0))
return 0;
int neg = (sum - target) / 2;
int f[n + 1][neg + 1];
f[0][0] = 1;
for (int i = 1; i <= neg; i++) f[0][i] = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= neg; j++)
{
f[i][j] = f[i - 1][j];
if (j >= nums[i - 1])
f[i][j] += f[i - 1][j - nums[i - 1]];
}
}
return f[n][neg];
}
};
回溯法
class Solution {
public:
int count = 0;
int findTargetSumWays(vector<int>& nums, int target) {
backtrack(nums, target, 0, 0);
return count;
}
void backtrack(vector<int>& nums, int target, int x, int sum)
{
if (x == nums.size())
{
if (sum == target)
count ++;
return;
}
else{
backtrack(nums, target, x + 1, sum + nums[x]);
backtrack(nums, target, x + 1, sum - nums[x]);
}
}
};