文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 递归
    • 2.2 DP

1. 题目

给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 +-中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

示例 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。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/target-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 递归

class Solution {public:int findTargetSumWays(vector<int>& nums, int S) {int count = 0;bt(0,0,nums,S,count);return count;}void bt(int i, int cursum, vector<int>& nums, int &S, int &count) {if(i == nums.size()){if(cursum == S)++count;return;}bt(i+1,cursum+nums[i],nums,S,count);bt(i+1,cursum-nums[i],nums,S,count);}
};


循环BFS,超时

class Solution {public:int findTargetSumWays(vector<int>& nums, int S) {int count = 0, n, lv = 0;queue<int> q;q.push(0);while(!q.empty()){n = q.size();while(n--){if(lv == nums.size()){if(q.front()==S)++count;q.pop();}else{q.push(q.front()+nums[lv]);q.push(q.front()-nums[lv]);q.pop();}}lv++;}return count;}
};

2.2 DP

参考别人的
假设P是正子集,N是负子集 例如: 假设nums = [1, 2, 3, 4, 5],target = 3,一个可能的解决方案是+1-2+3-4+5 = 3 这里正子集P = [1, 3, 5]和负子集N = [2, 4]

如何将其转换为子集求和问题:

                   sum(P) - sum(N) = target
sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N)2 * sum(P) = target + sum(nums)

原来的问题转化为一个求子集的和问题: 找到nums的一个子集 P,使得sum( P ) = (target + sum(nums)) / 2,从上面最后个式子,可看出 target+sum(nums) 为偶数

class Solution {public:int findTargetSumWays(vector<int>& nums, int S) {int i, j, sum_nums = 0;for(i = 0; i < nums.size(); ++i)sum_nums += nums[i];if((long(sum_nums)+S)%2 != 0 || S > sum_nums)return 0;S = (S+sum_nums)>>1;long *dp = new long [S+1];memset(dp,0,(S+1)*sizeof(long));dp[0] = 1;for(i = 0; i < nums.size(); ++i){for(j = S; j >= 0; --j){if(dp[j] != 0 && j+nums[i] <= S)dp[j+nums[i]] += dp[j];}}return dp[S];}
};

LeetCode 494. 目标和(DFS+DP)相关推荐

  1. LeetCode—494. 目标和(Target Sum)——分析及代码(Java)

    LeetCode-494. 目标和[Target Sum]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代码 (3)结果 2. 动态规划+节省空间 (1)思路 ...

  2. leetcode - 494. 目标和

    494. 目标和 -------------------------------------------- 给定一个非负整数数组,a1, a2, -, an, 和一个目标数,S.现在你有两个符号 + ...

  3. leetcode 494. 目标和

    目标和题解集合 记忆化搜索 动态规划 滚动数组优化 一维优化---巧妙转换为01背包问题 记忆化搜索 思路: 将问题转化为对一颗多叉树的遍历,而这里每个数字都有+与-的两种选择,因此这里是构造成二叉树 ...

  4. 96. Leetcode 494. 目标和 (动态规划-背包问题)

    步骤一.确定状态: 确定dp数组及含义 dp[i]表示的是:装满当前的容量j,有多少种装法?, 存的是方法的数量 步骤二.推断状态方程: dp[j] += dp[j-nums[i]] 步骤三.规定初始 ...

  5. leetcode 494. 目标和

    给你一个整数数组 nums 和一个整数 target . 向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 ...

  6. DP | 16 494.目标和*

    本文记录的是刷题过程中的重要概念和笔记.如有侵权,请联系删除. 目录 494.目标和 思路 DP DP五部曲 1.确定dp数组(dp table)以及下标的含义 2.递推公式 3.dp数组初始化 4. ...

  7. LeetCode刷题复盘笔记—一文搞懂0 - 1背包之494. 目标和问题(动态规划系列第九篇)

    今日主要总结一下动态规划0-1背包的一道题目,494. 目标和问题 题目:494. 目标和 Leetcode题目地址 题目描述: 给你一个整数数组 nums 和一个整数 target . 向数组中的每 ...

  8. 【Leetcode刷题】:Python:494. 目标和

    题目 494. 目标和 代码:dp class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int ...

  9. LeetCode:1049.最后一块石头的重量II 494.目标和 474.一和零

    1049.最后一块石头的重量II 题目 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的 ...

最新文章

  1. Google Brain团队最新视频介绍
  2. Python学习之使用Python生成PDF报告
  3. Tensorflow【实战Google深度学习框架】预训练与微调含代码(看不懂你来打我)
  4. 通过 ViewState 保存 Self-Tracking Entities
  5. linux 下 select 函数的用法
  6. 体验XHProf(linux版本)
  7. 论定期修改电脑密码的重要性
  8. 使用ajax完成python flask前端与后台数据的交互
  9. ZZULIOJ 1100: 求组合数(函数专题)
  10. php学习笔记0001 变量作用域
  11. mysql双击同步_求助,WINDOWS下MYSQL双机同步的问题
  12. 细胞自动机 通用计算机,科学网—《走近混沌》-27-初级细胞自动机 - 张天蓉的博文...
  13. div 设置a4大小_转载 网页打印时设置A4大小
  14. 磁盘属性显示为RAW的SD卡CF卡U盘和硬盘怎么办?
  15. 安卓开发 之小白养成-Android环境搭建 二
  16. Nginx负载均衡是酱紫做的
  17. 计算机内存数值存储方式(原码、反码、补码)
  18. 合并请求格式太乱?工单内容各写各的?表单模板来帮你
  19. 记录从指尖悄悄流逝的时间
  20. LeetCode_二分图_中等_785. 判断二分图

热门文章

  1. html 转word c#,c#操作word类,进行html和word文档的互相转换
  2. jdbc mysql demo_JDBC_demo:java连接mysql过程
  3. 在使用apt-get update 时更行列表,显示[Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)]超时
  4. spring-boot+swagger实现WebApi文档
  5. appium+java(五)微信小程序自动化测试实践
  6. 1006实验一实验报告
  7. 【Head First Java 读书笔记】(一)基本概念
  8. CSS 中的定位:relative,absolute
  9. Hibernate+mysql 中文问题解决方案.
  10. 科大讯飞2021笔试题