新闻详情

新闻详情

首页 / 资讯中心 / 详情

23 01背包问题:动态规划的经典入门案例

发布时间:2026/9/27 11:18:13来源:尧图网络
23 01背包问题:动态规划的经典入门案例
一、问题引入01背包是动态规划中最经典的问题之一题目描述如下有一个容量为20的背包你有10件物品每件物品只能选一次每件物品都有对应的体积和价值请问如何选择物品才能让背包中物品的总价值最大二、问题简化与贪心算法的局限为了更清晰地理解问题我们先将背包容量简化为6物品简化为4件物品体积价值书12衣服23电视35桌子46贪心算法的尝试如果使用贪心算法优先选择单位体积价值最高的物品桌子单位体积价值为6/41.5优先选择占用体积4剩余体积2剩余体积2选择衣服占用体积2总价值为639但正确的最优解是选择书、衣服、电视总价值为23510占用体积1236刚好装满背包。这说明贪心算法无法得到最优解需要使用动态规划。三、动态规划解法1. 状态定义定义dp[i][w]表示前i件物品放入容量为w的背包中能获得的最大价值。2. 状态转移方程对于第i件物品有两种选择不选第i件物品dp[i][w] dp[i-1][w]选第i件物品dp[i][w] dp[i-1][w - wt[i]] val[i]其中wt[i]是第i件物品的体积val[i]是第i件物品的价值因此状态转移方程为dp[i][w] max(dp[i-1][w], dp[i-1][w - wt[i]] val[i])3. 空间优化我们可以将二维数组优化为一维数组因为每次计算只需要上一行的结果。优化后的状态转移方程为dp[w] max(dp[w], dp[w - wt[i]] val[i])。注意需要从背包容量从大到小遍历避免重复选择同一件物品。4. 解题过程我们以简化后的问题为例逐步计算初始化dp数组为[0, 0, 0, 0, 0, 0, 0]对应容量0到6处理第一件物品书体积1价值2容量0为0容量1-6为2dp数组变为[0, 2, 2, 2, 2, 2, 2]处理第二件物品衣服体积2价值3容量0-1不变容量2为max(2, dp[0]3)3容量3-6为max(2, dp[1]3)5dp数组变为[0, 2, 3, 5, 5, 5, 5]处理第三件物品电视体积3价值5容量0-2不变容量3为max(5, dp[0]5)5容量4为max(5, dp[1]5)7容量5为max(5, dp[2]5)8容量6为max(5, dp[3]5)10dp数组变为[0, 2, 3, 5, 7, 8, 10]处理第四件物品桌子体积4价值6容量0-3不变容量4为max(7, dp[0]6)7容量5为max(8, dp[1]6)8容量6为max(10, dp[2]6)10dp数组保持[0, 2, 3, 5, 7, 8, 10]最终容量为6的背包能获得的最大价值为10与正确答案一致。四、代码实现1. C语言实现#include stdio.h #define MAX(a, b) ((a) (b) ? (a) : (b)) int main() { // 物品数量、背包容量 int n 4, C 6; // 物品体积和价值 int wt[] {1, 2, 3, 4}; int val[] {2, 3, 5, 6}; // 初始化dp数组 int dp[7] {0}; for (int i 0; i lt; n; i) { // 从大到小遍历背包容量 for (int w C; w gt; wt[i]; w--) { dp[w] MAX(dp[w], dp[w - wt[i]] val[i]); } } printf(容量为%d的背包能获得的最大价值%d\n, C, dp[C]); return 0; }2. Python实现def knapsack_01(n, C, wt, val): dp [0] * (C 1) for i in range(n): for w in range(C, wt[i] - 1, -1): dp[w] max(dp[w], dp[w - wt[i]] val[i]) return dp[C] 测试简化后的问题 n 4 C 6 wt [1, 2, 3, 4] val [2, 3, 5, 6] print(容量为%d的背包能获得的最大价值%d % (C, knapsack_01(n, C, wt, val))) 测试原问题容量2010件物品 n 10 C 20 wt [3, 4, 2, 5, 3, 6, 4, 2, 7, 5] val [5, 6, 3, 8, 4, 9, 7, 4, 11, 7] print(容量为%d的背包能获得的最大价值%d % (C, knapsack_01(n, C, wt, val)))五、总结01背包问题的核心是动态规划通过记录子问题的解来避免重复计算。状态转移方程为dp[w] max(dp[w], dp[w - wt[i]] val[i])需要从大到小遍历背包容量。贪心算法无法得到最优解因为它只考虑了当前的最优选择而没有考虑全局最优。01背包问题是动态规划的基础掌握它可以帮助我们理解更复杂的动态规划问题。 点赞 收藏 关注获取更多算法入门内容
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

如何做淘客推广网站避坑指南:3步搞定高转化落地页 2026/9/27 13:07:06

如何做淘客推广网站避坑指南:3步搞定高转化落地页

如何做淘客推广网站避坑指南:3步搞定高转化落地页 很多老板一上来就买模板,结果上线后页面卡顿、样式错乱,连手机端打开都看不清商品图。这种“模板网站太丑不够用”的痛点,直接导致流量进来就流失,转化率惨不忍睹。做淘客推广,网站就是你的24小时自…

阅读更多 →
效率直接起飞!盘点2026年冠绝行业的AI论文软件,TaoToken统一Key接入实测 2026/9/27 13:06:53

效率直接起飞!盘点2026年冠绝行业的AI论文软件,TaoToken统一Key接入实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
福州电商网站建设多少钱?避坑指南与SEO实战 2026/9/27 13:06:52

福州电商网站建设多少钱?避坑指南与SEO实战

福州电商网站建设多少钱?避坑指南与SEO实战 昨晚三点,福州软件园的一位电商老板给我打电话,声音都在抖。他的官网首页突然挂了一条黄色广告,点击率飙升,但转化率归零。更吓人的是,后台被植入了挖矿脚本,服务器CPU…

阅读更多 →
从 Intel Parallel Studio XE 迁移到 Intel oneAPI:HPC Toolkit 配置与验证指南 2026/9/27 13:06:52

从 Intel Parallel Studio XE 迁移到 Intel oneAPI:HPC Toolkit 配置与验证指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Lovable:欧洲增长最快的初创公司,如何用统一 Key 打通 AI 编程工具链 2026/9/27 13:06:46

Lovable:欧洲增长最快的初创公司,如何用统一 Key 打通 AI 编程工具链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Vibe Coding 实战:context7-mcp 与 server-sequential-thinking 的 config.toml 配置骨架 2026/9/27 13:06:46

Vibe Coding 实战:context7-mcp 与 server-sequential-thinking 的 config.toml 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉