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

示例 1:
输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 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
+1 + 1 + 1 + 1 - 1 = 3

示例 2:
输入:nums = [1], target = 1
输出:1

提示:
1 <= nums.length <= 20
0 <= nums[i] <= 1000
0 <= sum(nums[i]) <= 1000
-1000 <= target <= 1000

这道题想要用01背包解决需要非常了解01背包,看到这道题到底该怎么往01背包上去靠呢?下面来分析一下:
先看题,找找哪里有01背包的特点和我们能得到的信息
首先,我们可以发现每一种方法里面nums[i]都只能使用一次
其次,nums[i]类似于01背包中的物品重量和物品价值;
现在只差一个条件就是背包容量bagsize了,bagsize该怎么求呢?
我们单看每种方法可以发现,如果设加法的总和为a, nums数组和为sum
那么减法的总和就为sum - a,
所以target = a - (sum - a),即加法和减去减法和
上式变换一下就可以得到 a = (target + sum) / 2;
这时问题就可以化为:装满容量为a背包,有几种方法
即a就是bagsize
当然这里还需要注意一个点,就是a取整的问题

if ((target + sum) % 2) return 0;

接下来就来看看这个背包问题转化后的样子:
背包容量:bagsize = (target + sum) / 2;
第i个物品质量:nums[i];
第i个物品价值:nums[i];

接下来就开始递归分析了:
1,dp[j] 表示 j 容量下,填满后的方法数;
2,想要求dp[j]需要求出dp[j - nums[i]]相加就可以了,即

dp[j] += dp[j - nums[i]];

3,初始值需要注意,dp[0] = 1,即装满容量为0的背包,有1种方法,就是装0件物品。
如果忘记初始化那么所有情况下的方法数都会为0;
4,遍历顺序和之前一样,外层循环物品,内层逆序循环背包容量;

代码如下:

class Solution {public:int findTargetSumWays(vector<int>& nums, int target) {int n = nums.size(), sum = 0;for (int i = 0; i < n; ++i) sum += nums[i];if (target > sum) return 0;if ((target + sum) % 2) return 0;int bagsize = (target + sum) / 2;vector<int> dp(bagsize + 1, 0);dp[0] = 1;for (int i = 0; i < n; ++i) {for (int j = bagsize; j >= nums[i]; --j) dp[j] += dp[j - nums[i]];}return dp[bagsize];}
};

总结

这道题值得注意的就是初始问题向01背包的转化过程,并且还需要注意转移方程和之前有不同,其实这个转移方程多用于求这种组合类(计数)的问题,之前那个转移方程求得都是最值问题,所以可以有个印象,方便快速判断转移方程;

目标和(01背包应用)相关推荐

  1. 494. 目标和 - 01背包中装满背包有几种方法的问题

    ✅01背包中"装满背包有几种方法"的问题 这道题难就难在如何把题面转化为背包问题

  2. LeetCode 1774. 最接近目标价格的甜点成本(DFS / 01背包)

    文章目录 1. 题目 2. 解题 1. 题目 你打算做甜点,现在需要购买配料.目前共有 n 种冰激凌基料和 m 种配料可供选购.而制作甜点需要遵循以下几条规则: 必须选择 一种 冰激凌基料. 可以添加 ...

  3. 算法-动态规划(01背包)

    最近闲来无事,学学算法. 什么是动态规划,我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态.当前子问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式时间复杂度,因 ...

  4. 【算法分析】实验 4. 回溯法求解0-1背包等问题

    目录 实验内容 实验目的 实验结果 步骤1:描述与分析 步骤2:策略以及数据结构 步骤3 步骤4 步骤5 步骤6 实验总结 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设 ...

  5. 对01背包的分析与理解(图文)

    首先谢谢Christal_R的文章(点击转到链接)让我学会01背包 本文较长,但是长也意味着比较详细,希望您可以耐心读完. 题目: 现在有一个背包(容器),它的体积(容量)为V,现在有N种物品(每个物 ...

  6. ZCMU 1919: kirito's 星爆气流斩【01背包的二进制优化】

    ZCMU 1919: kirito's 星爆气流斩 Time Limit: 2 Sec  Memory Limit: 128 MB Description 主角kirito是使用世界首款完全潜行游戏& ...

  7. 1919: kirito's 星爆气流斩(多重背包转换为01背包+二进制优化)

    Description 主角kirito是使用世界首款完全潜行游戏"刀剑神域(Sword Art Online)"的玩家.曾经很幸运的参与过封闭测试,并买下正式版的kirito,正 ...

  8. java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题

    [TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...

  9. 动态规划之背包问题——01背包

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...

最新文章

  1. 微生物相关网络构建教程:MENA, LSA, SparCC和CoNet
  2. android 拼图课程设计,Flash拼图游戏制作课程设计报告
  3. Mac远程连接Windows桌面
  4. mysql/event.myd no fond_mysql Last_Error: Error 'File './sales.MYD' not found (Errcode: 24)
  5. 架构师养成之道-03-jvm内存分布详解
  6. 利用 git format-patch 和 git send-email 把修改的 patch 文件发送给 ffmpeg-devel
  7. Android深入浅出之Binder机制(转)
  8. 链表删除功能实现演示
  9. SQL Server 锁升级阈值
  10. 从项目实际问题引发的思考
  11. 面向过程和面向对象的区别,通俗易懂
  12. API网关的几点思考
  13. 交安ABC考试单选练习题库
  14. 奇幻RPG(人物构建 与 Abstract Factory模式)
  15. 激光认证,激光安全等级认证,激光安全认证,激光等级认证,激光FDA认证。
  16. 懒人神器,IDEA插件之EasyCode,自动生成CRUD代码
  17. flutter comsumer局部刷新的问题
  18. cad绘制正八边形_CAD怎么画正八边形 看完你学会了么
  19. JDBC简单连接查询MySQL数据库
  20. 2021-10-29 2021年资料员-通用基础(资料员)考试题及资料员-通用基础(资料员)免费试题

热门文章

  1. java中交通灯管理系统_java案例--交通灯管理系统学习
  2. java pdf添加图片_java实现在pdf模板的指定位置插入图片
  3. 中one_十月中大型SUV销量排行:途昂稳坐第一,理想ONE晋升亚军
  4. matlab模拟gpd,如何用ARMA模型预测中国GDP
  5. AGI:走向通用人工智能的【哲学】之现实世界的虚拟与真实——带你回看1998年的经典影片《The Truman Show》感悟“什么是真实”
  6. Python之ffmpeg-python:ffmpeg-python库的简介、安装、使用方法之详细攻略
  7. 成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred
  8. 成功解决ValueError: cannot assign without a target object
  9. Python语言学习之字母S开头函数使用集锦:set/sys/super用法之详细攻略
  10. 成功解决TypeError: unsupported operand type(s) for %: 'NoneType' and 'dict'