写在前面背包DP是普及组比较重要的算法之一用于解决贪心解决不了的问题先看题描述一个旅行者有一个最多能装 M 公斤的背包现在有 n 件物品它们的重量分别是 W1,W2,...,Wn,它们的价值分别为 C1,C2,...,Cn求旅行者能获得最大总价值。输入描述第 1 行两个整数M 背包容量M≤200 和 N ( 物品数量N≤30 )。第 2…N1 行每行二个整数 Wi,Ci表示每个物品的重量和价值。输出描述仅一行一个数表示最大总价值。样例输入 110 4 2 1 3 3 4 5 7 9样例输出 112提示M≤200N≤30分析先尝试暴力枚举每一个物品要或不要需要θ2^30显然会出现 time limit exceed 的问题。怎么办众所周知一般地背包容量越大在物体价值、重量一定的情况下背包容量越大理论上总价值越大。那么我们可不可以声明一个数组dp[2009]使dp[i]表示容积为i时的最大价值试试就逝世试试for (int i 1; i n; i) { for (int j m; j w[i]; j--) {//01背包因为物品只有一件不能重复选择每个数据在上一轮的基础上产生 dp[j] max(dp[j], c[i] dp[j - w[i]]); } }恭喜你发明了01背包算法该算法的状态转移方程一般为dp[j] max(dp[j], c[i] dp[j - w[i]]);再看第二道题描述设有 n 种物品每种物品有一个重量及一个价值。但每种物品的数量是无限的同时有一个背包最大载重量为 M今从 n 种物品中选取若干件(同一种物品可以多次选取)使其重量的和小于等于 M而价值的和为最大。输入描述第一行两个整数M ( 背包载重M≤200 )和 N ( 物品数量N≤30 )。第 2…N1 行每行二个整数 Wi,Ci表示每个物品的重量和价值。输出描述仅一行一个数表示最大总价值。样例输入 110 4 2 1 7 9 1 1 4 5样例输出 112提示M≤200N≤30分析两道题唯一的区别在于是否可以“重复选取”。如果我们还用01背包问题的状态转移方程再这样的样例中就会错得非常离谱样例输入 样例输出 10 4 10000000 54188 1 114514 1 396396 1 1 1000000我们的答案将会为1000000与标准答案差得很远。有同学说这好办啊把01背包加一层while不就行了吗确实针对本题可行但是如果数据量变成类似1≤m,n≤5*10^7且m*n≤5*10^7就不可行了。那么又有同学说把上一题中内层循环从倒序改为顺序不就行了吗于是for (int i 1; i n; i) { for (int j w[i]; j m; j) { dp[j] max(dp[j], c[i] dp[j - w[i]]); } }恭喜你发明了完全背包算法该算法的状态转移方程依旧为dp[j] max(dp[j], c[i] dp[j - w[i]]);但是变成顺序循环最后看一道题描述有 N 种物品和一个容量是 M 的背包。第 i 种物品最多有 si 件每件体积是 wi价值是 ci。求解将哪些物品装入背包可使物品体积总和不超过背包容量且价值总和最大。输出最大价值。输入描述第一行两个整数NM用空格隔开分别表示物品种数和背包容积。接下来有 N 行每行三个整数 wi,ci,si用空格隔开分别表示第 i 种物品的体积、价值和数量。输出描述输出一个整数表示最大价值。样例输入 14 5 1 2 3 2 4 1 3 4 3 4 5 2样例输出 110提示0N≤50000M≤50000ci,wi,si≤5000分析有同学说这好办啊把01背包加一层for不就行了吗但是本题数据显然不允许这样的操作学过《人教版物理八年级上册》中用托盘天平测量质量这一课的同学或许会想到老师上课问的一个问题为什么砝码质量分别为500g,200g,200g,100g,50g,20g,20g,10g游码质量为0~5.0g原因很简单用这些可以组成0~1105.0g中间的任何一种情况保留一位小数。那么如果将这类背包算法进行如下改动是不是就可以了呢int a[n * 30], b[n * 30], q 0; // 注意大数组建议开在全局中 for (int i 1; i n; i) { for (int j 1; ((j 1) - 1) * w[i] m ((j 1) - 1) s[i]; j 1) { a[q] j * c[i]; b[q] j * w[i]; if ((j 1) - 1 s[i]) { a[q] (s[i] 1 - (j 1)) * c[i]; b[q] (s[i] 1 - (j 1)) * w[i]; } } }然后再进行for (int i 1; i q; i) { for (int j m; j b[i]; j--) { dp[j] max(dp[j], dp[j - b[i]] a[i]); } }恭喜你又发明了多重背包算法其状态转移方程为dp[j] max(dp[j], dp[j - b[i]] a[i]);写在最后/声明文章为本蒟蒻原创欢迎各位dalao点赞收藏并提出您宝贵的建议
企业数字化 ERP 产品动态
相关推荐
Trae 积分制与兑换码避坑指南:免费模型部署和 MCP 联动实战 1. 积分制到底怎么玩:先搞懂规则再谈省钱Trae 这套积分体系,说白了就是“用积分换 AI 调用次数”。你每让 AI 帮你写一段代码、解释一个报错、生成一个组件,背后都在消耗积分。很多人一上来就急着找兑换码,结果连积分怎么扣、什么… · 2026/9/26 5:05:25
图书馆座位预约小程序毕设源码:从数据库到Spring Boot的完整改造指南 简介:一份面向高校毕业设计与课程设计场景的微信小程序图书馆预约系统完整源码包,基于Java SSM框架与原生小程序/uniapp开发,适合需要快速搭建前后端完整项目的计算机专业学生。资源包含前后端程序、MySQL数据库脚本、说明文档与演示PPT&… · 2026/9/26 5:05:13
职场常见阴谋与应对方法论 1. 借刀杀人:借领导/制度打压你
自己不出面,拿领导意思、公司规定当借口,处处卡你、针对你,让你无力反驳。
🔺破解:只认正式通知,不认口头施压,有疑问直接向制度源头核实。
2. 甩锅接… · 2026/9/26 5:44:56
VideoRAG开源实战:把视频自动转为结构化笔记与知识库问答 先问一个特别实在的问题:你看完一条30分钟的技术分享,过三天还能复述出几条核心结论?我以前觉得自己能记住,结果开会要给团队同步的时候,脑子里只剩一个模糊的印象——“那节课讲得不错”,具体讲了什么&… · 2026/9/26 5:44:56
SQL Server备份与还原实战:从完整备份到时间点恢复 做数据库这一行,备份和还原大概是唯一能让你半夜从床上爬起来、顶着冷汗操作的技术活。SQL Server的备份还原,说简单也简单,右键点两下就能出个.bak文件;说复杂也复杂,什么完整备份、差异备份、日志备份、恢复模式、NO… · 2026/9/26 5:44:56
华为2025校招目标院校名单深度解析:非目标院校如何逆袭? 1. 这份白名单到底在说什么每年秋招季,关于华为目标院校的讨论就会在应届生圈子里热起来。我前后跟进过几届校招,也帮不少学弟学妹看过简历、做过投递策略,发现大家对“目标院校白名单”这件事的误解其实挺深的。很多人以为这是一份官方盖章、… · 2026/9/26 5:44:56
IEC61850转Modbus协议网关如何应用?TaoToken统一Key打通配置链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 5:44:50
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46