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
For each integer, you should choose one from
its new symbol.
Find out how many ways to assign symbols to make sum of integers equal to target S.
示例:
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];
}
};
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];
}
};
相关文章推荐
- Combination Sum II问题及解法
- 3-sum问题平方对数级别解法(algs4)
- Minimum ASCII Delete Sum for Two Strings问题及解法
- Continuous Subarray Sum问题及解法
- Combination Sum III问题及解法
- Two Sum IV - Input is a BST问题及解法
- ※ Leetcode - Segment Tree - 307. Range Sum Query - Mutable (线段树+树状数组两种解法以及模板的常见问题解析)
- leetcode刷题,我的解法1 twosum问题
- Minimum Index Sum of Two Lists问题及解法
- Minimum Path Sum问题及解法
- 【Leetcode】416-Partition Equal Subset Sum -- javascript解法 01背包问题
- Subarray Sum Equals K问题及解法
- Path Sum II问题及解法
- Most Frequent Subtree Sum问题及解法
- Partition Equal Subset Sum问题及解法
- Two Sum II - Input array is sorted问题及解法
- Map Sum Pairs问题及解法
- JavaScript的two-sum问题解法
- Range Sum Query - Immutable问题及解法
- Find Smallest Letter Greater Than Target问题及解法