当前位置: 首页 > article >正文

动态规划练习八(01背包问题)

一、问题介绍与解题心得

01背包问题就是每个物品数量只有一个,每个物品可以取或不取,来达到收益最大,或者收益在某个值。

限制条件:背包容量有限,物品个数只有1个

解决问题:从价值入手(价值最大或是某个值),从容量入手(不超过最大体积还是刚好装到某一个体积)

设的 dp 表一般是 dp[i][j] 表示在 [1, i] 的物品中选择,符合要求 j 的价值

此处以01背包模板题为例:【模板】01背包_牛客题霸_牛客网

1、传统方法

这里根据要求的不同用两个 dp 表解决问题,分析过程不赘述,主要看总结的规律。

由于01背包中物品个数只有一个,所以选不选 i 物品都是去看 dp[i - 1] 位置的值,所以要进行空间优化的话就是用 dp[i - 1][j] 和 dp[i - 1][j - v[i]] 来更新 dp[i] 的值,而我们现在只有一个一维数组,此时要开始更新 dp[i] 那么一维数组中必然存放的是已经更新完成的 dp[i - 1],那已知我们要更新的 dp[i] 是需要旧的一维数组表中的,相对于 j 位置之前的值,所以 dp[i] 的更新一定是从后向前的更新,防止覆盖。

所以总结,01背包问题的空间优化是删去行元素,从后向前更新。

2、空间优化

二、例题

1、分割等和子集

416. 分割等和子集 - 力扣(LeetCode)

2、目标和

494. 目标和 - 力扣(LeetCode)

3、最后一块石头重量2

1049. 最后一块石头的重量 II - 力扣(LeetCode)

三、总结

其实01背包问题就是要你把问题转化成在一段数据里面取出一部分数据满足条件。数据只有一个。

难点就是如何转化成取数据,如第二第三题就是把符号的正负选择转化成在一段数据中取出一些正数来满足题目要求。


http://www.kler.cn/a/533686.html

相关文章:

  • RocketMQ实战—4.消息零丢失的方案
  • 38. RTC实验
  • TCP编程
  • 手写单例模式
  • js笔记(黑马程序员)
  • STM32_SD卡的SDIO通信_DMA读写
  • 用 Python 绘制爱心形状的简单教程
  • 企业百科和品牌百科创建技巧
  • 【CSS】谈谈你对BFC的理解
  • 开源数据分析工具 RapidMiner
  • YK人工智能(五)——万字长文学会torch模型微调
  • 不同数据库与 WebGL 集成
  • ES6中的map和原生的对象有什么区别?
  • 信息学奥赛一本通 2089:【22CSPJ普及组】上升点列(point) | 洛谷 P8816 [CSP-J 2022] 上升点列
  • 题解:洛谷 P1608 路径统计
  • 2.5寒假作业
  • springboot校园数字化图书馆系统设计与实现
  • 数据结构【链式队列】
  • DeepSeek本地部署及其他应用接入
  • 【TensorFlow】T1:实现mnist手写数字识别
  • 基于springboot校园点歌系统
  • 15.<Spring Boot 日志>
  • 全流程安装DeepSeek开源模型
  • 深度学习|表示学习|卷积神经网络|Batch Normalization在干什么?|19
  • 【lua编程实操(一)】函数和闭包
  • 13.代理模式(Proxy Pattern)