题意
题解
方法一:暴力搜索
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int ans = 0;
int n = nums.size();
for (int i = 0; i < pow(2, n); i++) {
int sum = 0;
for (int j = 0; j < n; j++) {
if ((1 << j) & i) sum += nums[j];
else sum -= nums[j];
}
if (sum == target) ans++;
}
return ans;
}
};
方法二:回溯
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 index, int sum) {
if (index == nums.size()) {
if (sum == target) count++;
} else {
backtrack(nums, target, index+1, sum + nums[index]);
backtrack(nums, target, index+1, sum - nums[index]);
}
}
};
方法三:动态规划
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum = 0;
int n = nums.size();
for (int i = 0; i < n; i++) sum += nums[i];
int diff = sum - target;
if (diff < 0 || diff % 2) return 0;
int neg = diff / 2;
int dp[n+1][neg+1];
memset(dp, 0, sizeof(int) * (n+1) * (neg+1));
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= neg; j++) {
if (nums[i-1] <= j) dp[i][j] = dp[i-1][j-nums[i-1]] + dp[i-1][j];
else dp[i][j] = dp[i-1][j];
}
}
return dp[n][neg];
}
};