给定一个非负整数数组,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 位整数存下。

方法一:DFS暴力搜索

class Solution {
public:int findTargetSumWays(vector<int>& nums, int S) {int N=nums.size();int sum=0,result=0;DFS(nums,0,N,S,sum,result);return result;}void DFS(vector<int>& nums,int index,int N,int S,int sum,int &result){if(index==N){if(sum==S){result++;}return;}DFS(nums,index+1,N,S,sum+nums[index],result);DFS(nums,index+1,N,S,sum-nums[index],result);return;}
};

方法二:动态规划

class Solution {
public:int findTargetSumWays(vector<int>& nums, int S) {//第一步将所有元素进行求和long long sum = 0;for(int num : nums){sum += num;}//sum代表的含义是选择所有物品,[+,+,+...+],因为所有物品都是加号//S代表的所有物品求和去除某些物品的两倍,[+,+,-,-,+....-],负号的物品不但不选还需要重背包中取出同样重量的物品//sum + S代表的是S中选择的物品选择两次,(S中负号物品与sum中对应的正号物品抵消,剩下的正号物品选择了两次)long long myS = sum + S;if (sum < S || myS % 2 == 1){//剪枝return 0;}myS = myS / 2;//现在就是需要确定总重量为myS的情况数vector<int> dp(myS + 1,0);//dp[i]代表的是凑出重量为i的情况数dp[0] = 1;//进行动态规划for(int num : nums){for(int i = myS; i >= num; --i){dp[i] += dp[i-num];} }  return dp[myS];}
};

目标和—leetcode494相关推荐

  1. 【代码随想录】-动态规划专题

    文章目录 理论基础 斐波拉契数列 爬楼梯 使用最小花费爬楼梯 不同路径 不同路径 II 整数拆分 不同的二叉搜索树 背包问题--理论基础 01背包 二维dp数组01背包 一维数组(滚动数组) 装满背包 ...

  2. Makefile-----GNU

    GNU Make 使用手册(中译版) 翻译:于凤昌 译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级 ...

  3. Leetcode494. 目标和

    Leetcode494. 目标和 相似题目: Leetcode416. 分割等和子集 题目: 给你一个整数数组 numsnumsnums 和一个整数 targettargettarget . 向数组中 ...

  4. Leetcode--494. 目标和

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

  5. 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则

    1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...

  6. LeetCode简单题之找出数组排序后的目标下标

    题目 给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target . 目标下标 是一个满足 nums[i] == target 的下标 i . 将 nums 按 非递减 顺序排序后, ...

  7. LeetCode简单题之按既定顺序创建目标数组

    题目 给你两个整数数组 nums 和 index.你需要按照以下规则创建目标数组: 目标数组 target 最初为空. 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target ...

  8. LeetCode简单题之寻找比目标字母大的最小字母

    题目 给你一个排序后的字符列表 letters ,列表中只包含小写英文字母.另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母. 在比较时,字母是依序循环出现的.举个例子 ...

  9. 微调torchvision 0.3的目标检测模型

    微调torchvision 0.3的目标检测模型 本文将微调在 Penn-Fudan 数据库中对行人检测和分割的已预先训练的 Mask R-CNN 模型.它包含170个图像和345个行人实例,说明如何 ...

最新文章

  1. 基于ArcGIS JS API实现垂直滑动缩放条
  2. 通俗易懂:贪心算法(二):区间问题 (力扣435无重叠区间)
  3. 如何查看oracle用户级别,用户级别的Oracle 导入导出
  4. C语言高级编程:指针和数组
  5. 【求助】AIX5.3主机下 memcached的内存使用异常
  6. matlab——使用gird函数画背景格
  7. ROS学习笔记二:探索ROS文件系统
  8. 奇安信专家:近八成软件存开源漏洞 供应链需全生命周期安全防护
  9. VMware 修复 NSA 报告的 0day
  10. GDAL更新至1.8.1后,通过属性查询矢量出错问题的解决方式
  11. LC-1186 连续子数组中可删除一个数的最大和
  12. Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的
  13. C语言,函数调用使用方法
  14. 手机号段199/198/166,横空出世
  15. VMware 15.6版本下载安装
  16. SpringBoot+Quartz+数据库存储
  17. 德标螺纹规格对照表_(外)内六角螺塞标准编号-国家标准JB/德标DIN
  18. linux 安装 rtl8111e / r8168 驱动
  19. OpenPose:实时多人2D姿态估计
  20. 海思移植 APR(Apache Portable Runtime)

热门文章

  1. 基于php的地铁查询系统,省时方便的小程序:查地铁
  2. ansible提权操作
  3. program的发展史与两个数学方法
  4. Java的Object类
  5. $.ajax()方法详解(网上引用)
  6. 剑指Offer_12_数值的整数次方
  7. ASP.NET MVC3 Razor视图引擎-基础语法
  8. Photoshop阴影与内阴影
  9. 4.day11_包和权限修饰符-1
  10. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - B. 矩形切割