给定一个非负整数的列表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.
例2:
输入: nums 为 [], S 为 3.
输出: 0
解释:
没有方法能让和为3
注意事项
- 给定数组的长度是正整数而且不会超过
20
。 - 所有元素的和不会超过
1000
。 - 输出结果一定在32位整数范围内。
class Solution {
public:
/**
* @param nums: the given array
* @param s: the given target
* @return: the number of ways to assign symbols to make sum of integers equal to target S
*/
// int s;
// vector<int> nums;
int findTargetSumWays(vector<int> &nums, int s)
{
// Write your code here
// this->s = s;
// this->nums = nums;
int size = nums.size();
if(size == 0)
return 0;
return dp(size-1, s,nums);
}
int dp(int index, int target, vector<int> &nums)
{
if(index < 0)
return 0;
else if(index == 0)
{
if(nums[index] == target && -nums[index] == target)
return 2;
else if(nums[index] == target || -nums[index] == target)
return 1;
else
return 0;
}
// int sum1 = dp(index-1, target + nums[index],nums);
// int sum2 = dp(index-1, target - nums[index],nums);
// int ret = sum1 + sum2;
return dp(index-1, target + nums[index],nums) + dp(index-1, target - nums[index],nums);
}
};