您的位置:首页 > 其它

Target Sum问题及解法

2017-09-14 09:15 253 查看
问题描述:

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.

示例:

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 = 3

There are 5 ways to assign symbols to make the sum of nums be target 3.


Note:

The length of the given array is positive and will not exceed 20.
The sum of elements in the given array will not exceed 1000.
Your output answer is guaranteed to be fitted in a 32-bit integer.

问题分析:

根据题意,数组nums的和的范围在[-sum,sum](sum为所有元素之和)之中,所以我们可以利用动态规划求解,将[-sum,sum]中的值映射到[0,2 * sum]上,则新dp[j + nums[i]] += 旧dp[j], 新dp[j - nums[i]] += 旧dp[j], j 表示元素和,nums[i]表示第i个元素的值。

过程详见代码:

class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int sum = 0;
for (auto i : nums) sum += i;
vector<int> dp(2 * sum + 1, 0);
if (S > sum || S < -sum || nums.empty()) return 0;
dp[sum] = 1;
for (int i = 0; i < nums.size(); i++)
{
vector<int> temp(2*sum + 1, 0);
for (int j = 0; j < 2 * sum + 1; j++)
{
if(dp[j])
{
temp[j + nums[i]] += dp[j];
temp[j - nums[i]] += dp[j];
}
}
dp = temp;
}
return dp[sum + S];
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: