描述
给定一个非负整数的列表a1,a2,…an,再给定一个目标S。现在用+和-两种运算,对于每一个整数,选择一个作为它前面的符号。
找出有多少种方法,使得这些整数的和正好等于S。
说明
1、给定数组的长度是正整数而且不会超过20。
2、所有元素的和不会超过1000。
3、输出结果一定在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
解析
var findTargetSumWays = function(nums, S) {
if (nums == null || nums.length == 0) return 0;
var sums = 0;
nums.forEach(num => sums += num);
if (sums < S || (S + sums) % 2 == 1) return 0;
var p = (S + sums) >> 1;
var dp = new Array(p + 1).fill(0);
dp[0] = 1;
nums.forEach(num => {
for (var i = p; i >= num; i--) {
dp[i] += dp[i - num];
}
})
return dp[p];
};