目标和
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]
};
Cocolib