給定一個非負整數數組,a1, a2, …, an, 和一個目標數,S。現在你有兩個符號 + 和 -。對於數組中的任意一個整數,你都可以從 + 或 -中選擇一個符號添加在前面。
返回可以使最終數組和爲目標數 S 的所有添加符號的方法數。
示例 1:
輸入: nums: [1, 1, 1, 1, 1], S: 3
輸出: 5
解釋:
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
一共有5種方法讓最終目標和爲3。
注意:
數組非空,且長度不會超過20。
初始的數組的和不會超過1000。
保證返回的最終結果能被32位整數存下。
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int sum = 0;
dfs(nums,0,S,0,sum);
return sum;
}
void dfs(vector<int>& nums,int index,int S,long long nowSum,int& sum) {
//nums是容器,index是容器下標,S是目標值,nowSum是目前的值,sum是有多少種方法,sum一定要加&指向地址,否則自增值不起效
if(index==nums.size()){//說明已經加到了末尾
if(nowSum==S){//如果nowsum等於目標值S
sum=sum+1;//方法數加1
}
return;
}
else if(index<nums.size()){
dfs(nums, index+1,S,nowSum+nums[index],sum);//nowSUM進行加
dfs(nums, index+1,S,nowSum-nums[index],sum);//nowSum進行減
}
}
};