目标和
TIP
给你一个整数数组 nums
和一个整数 target
。
向数组中的每个整数前添加 '+'
或'-'
,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1]
,可以在 2
之前添加 '+'
,在 1
之前添加 '-'
,然后串联起来得到表达式 "+2-1"
。 返回可以通过上述方法构造的、运算结果等于 target
的不同 表达式 的数目

思路
动规五部曲
- 确定dp数组以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
如何将问题转化为0-1背包问题,这道题和前面两道题略有不同,前两道是让我们求背包的容量(能否装满/容量之内的最大值),但是这道是让我们求装满背包有多少种方法。
- 首先观察发现,如果
sum-target
是一个奇数,我们发现不能满足相减之后得到target
- dp数组以及下标的含义:填满
j
(包括j)这么大容积的包,有dp[j]
种方法
js
var findTargetSumWays = function(nums, target) {
let sum = nums.reduce((pre,cur)=>pre+cur,0)
if((sum-target)%2!=0 || sum-target<0) return 0
let n = Math.floor((sum-target)/2) //背包容量
let dp =[]
for(let j=0;j<=n;j++){
dp[j] = 0
}
dp[0] = 1 //初始化为 1
for(let i=0;i<nums.length;i++){ //物品
for(let j=n;j>=nums[i];j--){ //背包
dp[j] += dp[j-nums[i]]
}
}
console.log(dp)
return dp[n]
};