参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们受益!
# 494.目标和 [力扣题目链接](https://leetcode.cn/problems/target-sum/) 难度:中等 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 示例: * 输入: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。 提示: * 数组非空,且长度不会超过 20 。 * 初始的数组的和不会超过 1000 。 * 保证返回的最终结果能被 32 位整数存下。 ## 算法公开课 **[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[装满背包有多少种方法?| LeetCode:494.目标和](https://www.bilibili.com/video/BV1o8411j73x/),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 ## 思路 如果对背包问题不都熟悉先看这两篇: * [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html) * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) 如果跟着「代码随想录」一起学过[回溯算法系列](https://programmercarl.com/回溯总结.html)的录友,看到这道题,应该有一种直觉,就是感觉好像回溯法可以爆搜出来。 事实确实如此,下面我也会给出相应的代码,只不过会超时。 这道题目咋眼一看和动态规划背包啥的也没啥关系。 本题要如何使表达式结果为target, 既然为target,那么就一定有 left组合 - right组合 = target。 left + right = sum,而sum是固定的。right = sum - left 公式来了, left - (sum - left) = target 推导出 left = (target + sum)/2 。 target是固定的,sum是固定的,left就可以求出来。 此时问题就是在集合nums中找出和为left的组合。 ### 回溯算法 在回溯算法系列中,一起学过这道题目[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)的录友应该感觉很熟悉,这不就是组合总和问题么? 此时可以套组合总和的回溯法代码,几乎不用改动。 当然,也可以转变成序列区间选+ 或者 -,使用回溯法,那就是另一个解法。 我也把代码给出来吧,大家可以了解一下,回溯的解法,以下是本题转变为组合总和问题的回溯法代码: ```CPP class Solution { private: vector
class Solution {
public:
int findTargetSumWays(vector