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

【算法】:动态规划--背包问题

背包问题

引言

什么是背包问题?
背包问题就是一个有限的背包,给出一定的物品,如何合理的装入物品使得背包中的物品的价值最大?

01背包

01背包,顾名思义就是每一种给定的物品要么选择,要么不选,求出最终最大的价值。
针对01背包又有两种情况,一种情况是要求最终装满背包,第二种是不用一定装满背包。
下面给出一道例题,并且给出01背包的dp解法。

  1. leetcode LCR 101 : 分割等和子集
    在这里插入图片描述
    解题思路:
    明显,我们可以理解为这里有一个Sum{ai} / 2的背包,我们需要将他装满,这道题比较简单,没有value值。
    状态转移方程:(01背包常见的状态转移方程)
  • dp[i][j] : 前i个元素能够填充大小为j的背包的最大价值
  • dp[i][j] = max { dp[i - 1][j] , dp[i -1][j - Size[i]] + value[i] }

第i个位置,可以不选择它装入背包, 这个时候为dp[i - 1][j] , 也可以选择,这个时候为dp[i -1][j - Size[i]] + value[i]

细节: 
1. 判断j >= Size[i] 
2. 初始化size的时候 + 1,可以更好处理边界条件

在这里插入图片描述
总结:其实无论是否一定需要装满,状态转换方程都差不多,最大的差别是初始化dp的时候存在较大的差异,希望读者注意。

完全背包

完全背包,和01背包的差异就是每一种物品可以选取多次,其他一样,也是可以分为装满和不需要一定装满两种情况。
不太会Latex, 只有手绘。
请添加图片描述
例题:leetcode LRC 103 零钱兑换
在这里插入图片描述
解法:
在这里插入图片描述

总结

这里列举了常见的基础背包问题的解法,再往后学习就是竞赛难度的背包问题,这里我们不再继续赘述,读者想要了解更加复杂的背包问题,可以自行继续探索。

相关文章:

  • Spring AI 源码解析:Tool Calling链路调用流程及示例
  • 夏日旅行(广度优先搜索)
  • 嵌入式软件-如何做好一份技术文档?
  • 深入理解设计模式之适配器模式
  • 《Python语言程序设计》第4章第8题3个个位数之间比大小。‘a小于b而b大于c’这是最有漏洞的一个对比,请问我如何判断a和c
  • Jenkins的Pipline中有哪些区块,以及其它知识点整理
  • 计算机网络学习(五)——TCP
  • C++ --- string
  • 全局异常处理器
  • 开篇:MCP理论理解和学习
  • 基于Python的自动化视频编辑脚本设计,能够处理视频剪辑、添加字幕、文本动画、音效和图形等功能
  • 24. 日志的基本实现方式
  • 第十天的尝试
  • Gateway全局过滤器:接口耗时统计与黑白名单配置
  • Linux环境变量与地址空间
  • maxkey单点登录系统
  • LeetCode-贪心-买卖股票的最佳时机
  • SOC-ESP32S3部分:11-任务创建
  • 基于亚博K210开发板——lvgl 图形化实验
  • ubuntu ollama /Dify/Docker部署大模型
  • 如何在360网站网页上做笔记/私域运营软件
  • 哪做网站好/石家庄新闻网
  • 网站宽度 超宽/网络营销做得好的酒店
  • 大名网站建设费用/卡点视频软件下载
  • 提供秦皇岛网站建设哪里有/怎么样进行网络推广
  • 政府网站建设可行性研究报告 baidu/衡阳seo优化推荐