给定一个非负整数的列表a1,a2,...an,再给定一个目标S。现在用+
和-
两种运算,对于每一个整数,选择一个作为它前面的符号。
找出有多少种方法,使得这些整数的和正好等于S。
- 给定数组的长度是正整数而且不会超过
20
。 - 所有元素的和不会超过
1000
。 - 输出结果一定在32位整数范围内。
样例
例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
int findTargetSumWays(vector<int> &nums, int s)
{
if (nums.size() == 0)
{
if (s == 0)
{
return 1;
}
else
{
return 0;
}
}
if (nums.size() == 1 && s == nums[0])
{
return 1;
}
if (nums.size() == 1 && s == -nums[0])
{
return 1;
}
int count = 0;
vector<int>ret;
vector<int>tmp;
ret.push_back(nums[0]);
ret.push_back(-nums[0]);
for (int i = 1; i < nums.size(); i++)
{
for (int j = 0; j < ret.size(); j++)
{
int a = ret[j] + nums[i];
tmp.push_back(a);
if (i == nums.size() - 1 &&a == s)
{
count++;
}
a = ret[j] - nums[i];
if (i == nums.size() - 1 && a == s)
{
count++;
}
tmp.push_back(a);
}
ret = tmp;
tmp.clear();
}
return count;
}