代码随想录算法训练营之JAVA|第三十八天|494. 目标和

news2024/11/15 5:57:50

今天是第38天刷leetcode,立个flag,打卡60天。

算法挑战链接

494. 目标和icon-default.png?t=N6B9https://leetcode.cn/problems/target-sum/

第一想法

题目理解:题目给出一个数组,使用 + 或 - 算术符号,有多少种组合可以得到target的值。

拿到题目的第一想法是使用回溯算法,因为可以挨个去尝试。如果将所有的结果都尝试了,就可以得出有多少种组合可以满足。

但是很不幸,超时了。

看完代码随想录之后的想法 

依旧是 0-1 背包问题的解决方案。

之前我做的0-1背包解决的问题是:容量为J的背包,价值最大的解决方案,和这个组合的好像是不相干的。的确也是,看完代码随想录之后,明白了,这个是0-1背包的变形。

跟着动态规划的五部曲走一遍,或许可以明白这个变形是怎么来的。

动态规划的五部曲走起:

  • 确定dp数组(dp table)以及下标的含义

dp[j] 代表的含义是:在 0-i 物品任取的情况下,价值为 J 的组合有 dp[j] 种

  • 确定递推公式

这个可以从开始递推。

假设数组是[0,1,2,3,4,5],target 5

取0的时候,有dp[5]种方式

取1的时候,有dp[4]种方式

取2的时候,有dp[3]种方式

取3的时候,有dp[2]种方式

取4的时候,有dp[1]种方式

取5的时候,有dp[0]种方式

如果不明白可以在想想 dp[j] 的含义。

那么dp[5] = dp[0] + dp[1] + dp[2] + dp[3] + dp[4] + dp[5]

那么抽象在代码中可以写成是:

dp[j] += dp[j - nums[i]]
  • dp的初始化

dp[0] = 1,解释一下为什么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]]推导出来。

  • 确定遍历顺序

先遍历物品,然后在遍历容量,遍历容量的时候需要从大到小开始遍历,因为有每个物品只能使用一次的限制。

  • 举例推导dp数组

数据就不推导了。

今日收获

有些东西是会变化的,也许这个就是区分普通和厉害的一个很重要的点。

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

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

相关文章

URL中传递JSON字符串

今天遇见了一个需求,从post请求中在url里传递json字符串, 就是路径?参数11那种情况 最后怎么解决的呢? 需要使用前端方法,先用JSON.stringify格式化成字符串,再用encodeURIComponent把JSON里面的符号转转为url支持的…

1.2 Kali Linux的网络配置

前言 最新文章请见此处,持续更新,敬请订阅!https://blog.csdn.net/algorithmyyds/category_12418682.html 网络在如今的社会已是十分重要的媒介,如果没有网络,很多事情将难以办成。渗透测试也是一样——毕竟在攻击机…

新生报到:无压力的数字自我介绍

🌸 新生报到:无压力的数字自我介绍 🌸 开学季又来临,每个学校、每个班级都迎来了一批新鲜面孔。作为新生,面对陌生的环境和同学,首次的自我介绍无疑是一个让许多人感到紧张和迷茫的挑战。你是否曾因为害羞…

理解底层— —Golang的log库,二开实现自定义Logger

理解底层— —Golang的log库,实现自定义Logger 1 分析实现思路 基于golang中自带的log库实现:对日志实现设置日志级别,每天生成一个文件,同时添加上前缀以及展示文件名等 日志级别,通过添加prefix:[INFO]、…

C 字符串处理

字符数组 输入输出 输入函数 scanf(%s, s)读入字符串,在第一个空白符( 、\n 、\t )处停止,不读入空白符,在串尾自动添加\0’ 。gets(s)读入一行字符,直到遇到\n ,读入换行符并将其舍弃,在串尾自动添加\…

H5如何做性能测试?

说起H5性能测试,可能许多同学有所耳闻,但是不知道该如何去做性能测试,或者不知道H5应该关注哪些性能指标。今天我们就来看下。希望阅读本文后,能够有所了解。 常用指标 1、H5性能相关参数介绍 白屏时间:用户首次看到…

[LitCTF 2023]PHP是世界上最好的语言!!

进入环境看起来还是挺牛逼的,但是在右边输入框下有一个执行代码,有点牛 真的可以直接执行,那么 根据题目提示,我们得知flag,在根目录,所以我们可以直接利用 查看到flag位置 得到flag

IDEA插件反编译jar包

安装插件Java Decompiler 安装插件Java Decompiler成功之后重启idea 找到已安装插件的jar包 执行反编译 反编译 在已安装插件Java Decompiler的jar包位置下cmd命令执行反编译 java -cp "插件路径" org.jetbrains.java.decompiler.main.decompiler.ConsoleDec…

在线SM4(国密)加密解密工具

在线SM4(国密)加密解密工具

基于安卓的考研助手系统app 微信小程序

,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。HBuilder技术作为当前最流行的操作平台,自然也存在着大量的应用服务需求。 本课题研究的是基于HBuilder技术平台的安卓的考研助手APP,开发这款安卓的考研助手APP主要是为了…

【管理运筹学】第 6 章 | 运输问题(2,表上作业法 | 初始可行解的确定)

文章目录 引言二、表上作业法2.1 初始基可行解的确定2.1.1 最小元素法2.1.2 伏格尔法 写在最后 引言 承接前文,在对运输问题有了基本的了解后,我们开始深入学习表上作业的具体内容。 二、表上作业法 2.1 初始基可行解的确定 2.1.1 最小元素法 基本思…

攻防世界-倒立屋

原题 解题思路 用StegSolve打开文件,调通道没用,wp说用RGB信道打开可以找到,但说实话用大括号也没找到在哪,得是预先知道答案才找得到。

Linux常用命令_文件处理命令:su root

文章目录 1. 命令格式与目录处理命令ls1.1 命令格式1.2 目录处理命令:ls 2. 目录处理命令2.1 目录处理命令:mkdir2.2 目录处理命令:cd2.3 目录处理命令:pwd2.4 目录处理命令:rmdir2.5 目录处理命令:cp2.6 目…

C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

全文目录 前言fseek 重定位位置指示器函数ftell 获取当前文件指示器的位置rewind 重置位置指示器文本文件和二进制文件文件读取结束的判定feof 和 ferror 文件缓冲区总结 前言 有了文件的顺序读写基础,那么肯定会好奇文件的随机读写,毕竟顺序读写对于有…

构建与应用大数据环境:从搭建到开发与组件使用的全面指南

文章目录 环境搭建开发与组件使用性能优化与监控安全与隐私总结 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:大数据系列 ✨文章内容: 🤝希望作者…

基于 kernel 4.0 初始kmalloc

kmalloc 系列函数是驱动者常用来向内核大管家申请内存的API,今天抽空扒一扒它是怎么工作的;首先看看它的原型 1. kmalloc () 函数 static __always_inline void *kmalloc(size_t size, gfp_t flags) {if (__builtin_constant_p(size)) {if (size > …

性能测试工具分享推荐

性能测试工具 常用性能测试工具性能测试工具又分为软件性能测试工具和系统性能测试工具,以下主要从开源免费工具和商用工具两方面进行整理,开源工具是免费的但通常功能有限,商业工具价格也不便宜,具体还是要结合自己的需求来选择…

AI图片鉴黄检测合规图片API

AI图片鉴黄检测合规图片API 一、AI图片鉴黄检测合规二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 报错说明1、返回以下报错说明你没有正确传入检测是图片的参数(file参数), 且请求参数是**multipart/form-data**格式⚠️ 一、AI图片鉴黄检测合规 人工…

JUC——多线程补充

前置可看 Java——多线程和锁_java多线程锁_北岭山脚鼠鼠的博客-CSDN博客 线程创建的三种方式 Thread、Runnable、Callable Thread类 Runable接口 Callable接口 Lamda表达式 Lamda表达式_北岭山脚鼠鼠的博客-CSDN博客 静态代理模式(Thread类的原理) 如下代码中 真实对象…

前端vue2、vue3去掉url路由“ # ”号——nginx配置

文章目录 ⭐前言⭐vue2中router默认出现#号💖在vue2项目中去掉💖在vue3项目中去掉 ⭐vue打包 assetsPublicPath base 为绝对路径 /💖vue2 配置 assetsPublicPath💖vue3 配置 base💖验证 ⭐nginx 配置💖 使用…