class Solution {
public:
int res=0;
void dfs(vector<int>&nums, int index, int target){
if(index == nums.size()){
if(target == 0)
res++;
return;
}
dfs(nums, index+1, target-nums[index]);
dfs(nums, index+1, target+nums[index]);
}
int findTargetSumWays(vector<int>& nums, int target) {
dfs(nums,0,target);
return res;
}
};
dp 背包问题
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum =accumulate(nums.begin(),nums.end(),0);
if(abs(target)>sum) return 0;
int len =nums.size(),t=2*sum+1;
vector<vector<int>> dp(len,vector<int>(t,0));
dp[0][sum+nums[0]]++;
dp[0][sum-nums[0]]++;
int temp_boundary = nums[0];
for(int i=1;i<len;++i){
temp_boundary+=nums[i];
for(int j=sum-temp_boundary;j<=sum + temp_boundary;++j){
int L = j-nums[i]>=0? dp[i-1][j-nums[i]]:0;
int R = j+nums[i]<t? dp[i-1][j+nums[i]]:0;
dp[i][j] = L+R;
}
}
return dp[len-1][sum+target];
}
};