Target Sum
A.题意
Follow up for “Unique Paths”:
You are given a list of non-negative integers, a1, a2, …, an, and a target, S. Now you have 2 symbols + and -. For each integer, you should choose one from + and - as its new symbol.
Find out how many ways to assign symbols to make sum of integers equal to target S.
Example 1:
Input: nums is [1, 1, 1, 1, 1], S is 3.
Output: 5
Explanation:-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 = 3There are 5 ways to assign symbols to make the sum of nums be target 3.
Note:
1.The length of the given array is positive and will not exceed 20.
2.The sum of elements in the given array will not exceed 1000.
3.Your output answer is guaranteed to be fitted in a 32-bit integer.
题意大概是给你一个数组的数字然后你可以使用加号或者减号对两个相邻的元素求和,最后看有多少种方法能求得目标和。
B.思路
这道题其实就是深度优先搜索吧,每次选择一个符号最后判断是不是想要的结果就好了,控制一下dfs的深度保证不超出给定数组长度即可。
C.代码实现
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
if (nums.empty()) return 0;
dfs(nums, S, 0, 0);
return count;
}
void dfs(vector<int>& nums, int s, int k, int sum)
{
if (k == nums.size())
{
if (s == sum) count++;
return;
}
dfs(nums, s, k + 1, sum + nums[k]);
dfs(nums, s, k + 1, sum - nums[k]);
}
private :
int count = 0;
};