思路1:dp ->01背包 (从右向左)
思路转换:加:a 减:sum-a 2a-sum==tagert,a=(tagert+sum)/2 即在数组中找组成该数字的个数
转移方程:dp[i][j] = dp[i-1][j-nums[i]] + dp[i-1][j]
初始化:dp[0]=1
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum = accumulate(nums.begin(), nums.end(), 0), n = nums.size();
if (target > sum || target < -sum) return 0;
if ((target + sum) & 1) return 0; //
int tmp = (target + sum) / 2;
vector<int> dp(tmp + 1);
dp[0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = tmp; j >= nums[i]; --j) {
dp[j] = dp[j - nums[i]] + dp[j];
}
}
return dp[tmp];
}
};
易错点:
1:target + sum为奇数时直接return
思路2:dfs —>复杂度过高O(2^n)
class Solution {
public:
int ans = 0, n;
void dfs(vector<int>& nums, int target, int index, int sum) {
if (index == n) {
if (target == sum) ans++;
return ;
}
dfs(nums, target, index + 1, sum + nums[index]);
dfs(nums, target, index + 1, sum - nums[index]);
}
int findTargetSumWays(vector<int>& nums, int target) {
n = nums.size();
dfs(nums, target, 0, 0);
return ans;
}
};