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

news2024/11/23 5:44:21

今日主要总结一下动态规划0-1背包的一道题目,494. 目标和问题

题目:494. 目标和

Leetcode题目地址
题目描述:
给你一个整数数组 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

本题重难点

这道题目咋眼一看和动态规划背包啥的也没啥关系。

大家在做这道题之前最好看一下一文搞懂纯0-1背包问题我对0-1背包的基础理论知识有详细的讲解,本道题其实就是0-1 背包问题的应用,而这道题的难点主要在于怎么把494. 目标和问题抽象成一个0-1 背包问题。

本题要如何使表达式结果为target呢?

假设整数前添加 '+'号的总和为x,那么整数前添加 '-'号对应的总和就是sum - x。

所以我们要求的是 x - (sum - x) = target

x = (target + sum) / 2

此时问题就转化为,装满容量为x背包,有几种方法。**

这里的x,就是bagSize,也就是我们后面要求的背包容量。

大家看到(target + sum) / 2 应该担心计算的过程中向下取整有没有影响。

这么担心就对了,例如sum 是5,target是2的话其实就是无解的,所以:

当(target + sum) 不能整除2或者 target > sum时,都是没有无解的。

那么我们再回归到01背包问题,为什么是01背包呢?

因为每个物品(题目中的1)只用一次!

这次和之前遇到的背包问题不一样了,之前都是求容量为j的背包,最多能装多少。

本题则是装满有几种方法。其实这就是一个组合问题了。

  1. 确定dp数组以及下标的含义
    dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法
  2. 确定递推公式
    有哪些来源可以推出dp[j]呢?
    只要搞到nums[i]),凑成dp[j]就有dp[j - nums[i]] 种方法。

例如:dp[j],j 为5,

已经有一个1(nums[i]) 的话,有 dp[4]种方法 凑成 容量为5的背包。
已经有一个2(nums[i]) 的话,有 dp[3]种方法 凑成 容量为5的背包。
已经有一个3(nums[i]) 的话,有 dp[2]中方法 凑成 容量为5的背包
已经有一个4(nums[i]) 的话,有 dp[1]中方法 凑成 容量为5的背包
已经有一个5 (nums[i])的话,有 dp[0]中方法 凑成 容量为5的背包
那么凑整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起来。
所以求组合类问题的公式,都是类似这种:

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

这个公式在后面在讲解背包解决排列组合问题的时候还会用到!

  1. dp数组如何初始化
    从递归公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源,如果dp[0]是0的话,递归结果将都是0。
    这里有录友可能认为从dp数组定义来说 dp[0] 应该是0,也有录友认为dp[0]应该是1。
    其实不要硬去解释它的含义,咱就把 dp[0]的情况带入本题看看就是应该等于多少。
    如果数组[0] ,target = 0,那么 bagSize = (target + sum) / 2 = 0。 dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。
    所以本题我们应该初始化 dp[0] 为 1。
    可能有同学想了,那 如果是 数组[0,0,0,0,0] target = 0 呢。
    其实 此时最终的dp[0] = 32,也就是这五个零 子集的所有组合情况,但此dp[0]非彼dp[0],dp[0]能算出32,其基础是因为dp[0] = 1 累加起来的。
    dp[j]其他下标对应的数值也应该初始化为0,从递归公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。

  2. 确定遍历顺序
    我们在一文搞懂纯0-1背包问题讲过对于01背包问题一维dp的遍历,nums放在外循环,target在内循环,且内循环倒序。

  3. 举例推导dp数组

输入:nums: [1, 1, 1, 1, 1], target: 3

bagSize = (target + sum) / 2 = (3 + 5) / 2 = 4

dp数组状态变化如下:

在这里插入图片描述

C++代码

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

总结

动态规划
英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的

对于动态规划问题,可以拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

这篇文章主要总结了一些动态规划解决494. 目标和问题,依然是使用动规五部曲,做每道动态规划题目这五步都要弄清楚才能更清楚的理解题目!

本题还是有点难度,大家也可以记住,在求装满背包有几种方法的情况下,递推公式一般为:

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

后面我们在讲解完全背包的时候,还会用到这个递推公式!

欢迎大家关注本人公众号:编程复盘与思考随笔

(关注后可以免费获得本人在csdn发布的资源源码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国外网友分享如何从零开始打造一辆真正的自动驾驶汽车

在 2021 年夏天大学二年级结束后,我决定从事当时最先进的项目之一——从头开发自动驾驶软件并在真车上实现。在公开我的代码的一些主要部分并发布演示视频后,我收到了很多关于该项目的问题。因此,我决定分享开发过程背后的故事。 我一直对与人工智能和机器学习相关的任何事…

Java代码审计——ClassLoader 类加载机制

目录 前言&#xff1a; (一&#xff09;类加载机制 0x01 ClassLoader 类 0x02 loadClass()方法的流程 0x03 自定义的类加载器 0x04 loadClass()方法与 Class.forName 的区别 0x05 URLClassLoader &#xff08;二&#xff09;Java 动态代理 0x01 静态代理 0x02 动态代理…

2022最新 MySQL 内部技术架构面试题

更多面试题&#xff1a;https://javaxiaobear.gitee.io/ 47、MySQL内部支持缓存查询吗&#xff1f; 当MySQL接收到客户端的查询SQL之后&#xff0c;仅仅只需要对其进行相应的权限验证之后&#xff0c;就会通过Query Cache来查找结果&#xff0c;甚至都不需要经过Optimizer模…

dot product【点积】

&#xff08;1&#xff09;概念 点积在数学中&#xff0c;又称数量积&#xff08;dot product; scalar product&#xff09;&#xff0c;是指接受在实数R上的两个向量并返回一个实数值标量的二元运算。 两个向量a [a1, a2,…, an]和b [b1, b2,…, bn]的点积定义为&#xff…

点云数据集ShapeNet

目录 1. 数据采集的作者 2. 下载shapenet数据集的代码 3. 数据特点 3.1 每个数字文件夹代表一个类别 3.2 synsetoffset2category.txt 3.3 train_test_split文件夹 3.4 pts点云文件 3.6 seg分割类别文件 1. 数据采集的作者 article{yi2016scalable,title{A scalable ac…

idea导入eclipse项目的时候,Java图标变成黄色小J了,怎么解决?

凯哥今天导入一个15年时候写的小项目&#xff0c;当时使用的是eclipse写的。最近好几年都在使用idea&#xff0c;习惯了idea的&#xff0c;在用eclipse&#xff0c;不习惯&#xff0c;不顺手&#xff0c;就导入到idea中。发现&#xff0c;Java文件的图标变成了黄色的J。如下图&…

【Linux】详解套接字编程

文章目录网络套接字1.端口号1.1认识端口号1.2端口号VS PID2.TCP与UDP协议3.网络字节序4.socket编程4.1常用接口4.2sockaddr结构4.3.socket接口的底层工作4.4字符串IP VS 整形IP4.5 bind与INADDR_ANY5.UDP聊天服务器5.1va_start和va_end5.2vsnprintf函数5.3自定义日志类5.4UDP服…

【RTS】杜金房大神FreeSwitch分享笔记

技术万变不离其宗不管如何实现原理都是一样的。杜金房大神 RTS 高可用 一台机器上俩fs,公用同一个ip用户连接的是一个ip,不知道切了fs。两台主备数据同步

ARM 汇编编写 LED 灯

一、一步步点亮LED 1. 硬件工作原理及原理图查阅 LED 本身有 2 个接线点&#xff0c;一个是 LED 的正极&#xff0c;一个是 LED 的负极。LED 这个硬件的功能就是点亮或者不亮&#xff0c;物理上想要点亮一颗 LED 只需要给他的正负极上加正电压即可&#xff0c;要熄灭一颗 LED…

Linpack安装测试流程记录

软件背景 虽然很早就接触了HPC&#xff0c;也参与过一些项目&#xff0c;诸如电影动画渲染集群以及某博导老师的基因分析计算集群&#xff0c;但是对于跑超算的linpack&#xff0c;一直没时间上手玩。 Linpack是超算必测项目,也是考验优化能力的套件,很有意思&#xff0c;记录…

软件测试工程师到底要不要转行开发? 2022测试生涯该如何转型升级?

测试工程师到底是干啥的&#xff1f; 测试工程师转开发有多大希望&#xff1f; 为了能够解除大家心中的疑惑&#xff0c;我决定从以下几个方面来补充回答&#xff1a; 测试工程师到底是干什么的&#xff1f; 测试工程师转开发有多大希望&#xff1f; 测试工程师一定要转开发吗…

2023秋招,Java岗最全面试攻略,吃透25个技术栈Offer拿到手软!

我分享的这份春招 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&#xff0…

腾讯云服务器2核4G、4核8G、8核16G、16核32G配置报价表出炉

现在腾讯云服务器2核2G、2核4G、4核8G、8核16G、16核32G配置价格表已经出来了&#xff0c;大家可以参考一下。腾讯云轻量应用服务器为轻量级的云服务器&#xff0c;使用门槛低&#xff0c;按套餐形式购买&#xff0c;轻量应用服务器套餐自带的公网带宽较大&#xff0c;4M、6M、…

rocketmq安装、启动

1、下载 >wget http://mirror.bit.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-source-release.zip >unzip rocketmq-all-4.4.0-source-release.zip > cd rocketmq-all-4.4.0/ > mvn -Prelease-all -DskipTests clean install -U > cd distribution/targ…

[附源码]计算机毕业设计学生宿舍管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

5.函数与递归

一、函数 1.基本介绍 此前我们使用了很多库函数&#xff0c;现在我们可以定义自己的函数来帮助我们完成一些特定的任务。 函数返回值类型 函数名(变量1,变量2,...,变量n) {...return; }函数返回值类型有很多类&#xff1a; 可以为char,int,double,long long,string等基础数…

【servelt原理_13_状态管理】

状态管理 1.现有问题 Http是无状态的&#xff0c;不能保存每次提交的信息如果用户发来一个新的请求&#xff0c;服务器无法知道它是否与上次请求是否有联系.对于那么需要提交多次信息才能完成的操作&#xff0c;比如购物&#xff0c;就很有问题 2.概念 将浏览器和web服务器之…

npm vue 路由之一级路由(npm默认已经集成了vue)

npm vue 路由之一级路由&#xff08;npm默认已经集成了vue&#xff09; 文档https://v3.router.vuejs.org/zh/installation.html npm install vue-router3.5.2 --save 1.在App.vue上面添加 <router-view></router-view>2.在main.js上面添加 import VueRouter fro…

【计算机网络】计算机网络复习总结 ----- 计算机网络概述

计算机网络 内容管理计算机网络概述计算机网络定义计算机网络、互联网、因特网计算机网络产生和发展 &#xff08;略&#xff09;计算机网络分类按照网络作用范围分类&#xff1a;按照拓扑结构分类&#xff1a;按照交换技术分类按照应用模式分类&#xff1a;按照工作方式分类相…