news 2026/6/23 9:32:08

动态规划-背包问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划-背包问题

问题描述:0-1背包问题
输入:
一个背包,容量为 W。
n 个物品,每个物品有重量 w[i] 和价值 v[i]。
目标:在不超过背包容量的前提下,选择物品使得总价值最大。
限制:每个物品只能选 0 次(不选)或 1 次(选),不能分割。
示例:

背包容量 W = 5。
物品列表:[(重量, 价值)] = [(2, 3), (3, 4), (4, 5)]。
最大价值是多少?

动态规划的原理

  1. 分解问题:定义状态
    动态规划将问题分解为子问题,并通过状态表示子问题的解。对于背包问题:

状态定义:dp[i][j] 表示前 i 个物品在背包容量为 j 时的最大价值。
i:物品的索引(从 0 到 n-1)。
j:背包的剩余容量(从 0 到 W)。
2. 状态转移方程
对于每个物品 i 和容量 j,有两种选择:

不选第 i 个物品:dp[i][j] = dp[i-1][j](价值不变)。
选第 i 个物品:如果 w[i] <= j,则 dp[i][j] = dp[i-1][j - w[i]] + v[i](价值增加 v[i],但容量减少 w[i])。
最终取两种选择的最大值:

python
dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]) # 如果 w[i] <= j
3. 初始化
当 i = 0(没有物品)或 j = 0(容量为 0)时,dp[0][j] = 0 和 dp[i][0] = 0(无法装任何物品,价值为 0)。
4. 计算顺序
外层循环:遍历物品 i(从 1 到 n)。
内层循环:遍历容量 j(从 1 到 W)。
按顺序填充 dp 表,确保计算 dp[i][j] 时,dp[i-1][…] 已经计算完成。
5. 返回结果
最终结果是 dp[n][W],即前 n 个物品在容量为 W 时的最大价值。

#include<iostream>#include<vector>#include<algorithm>// 用于 std::maxusingnamespacestd;intknapsack_01(intW,vector<pair<int,int>>&items){intn=items.size();// 物品数量// dp[i][j] 表示前 i 个物品在容量 j 时的最大价值vector<vector<int>>dp(n+1,vector<int>(W+1,0));for(inti=1;i<=n;++i){intw=items[i-1].first;// 当前物品的重量intv=items[i-1].second;// 当前物品的价值for(intj=1;j<=W;++j){if(w>j){// 当前物品太重,无法装入背包dp[i][j]=dp[i-1][j];}else{// 选择装或不装当前物品,取最大值dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v);}}}returndp[n][W];// 返回最大价值}intmain(){intW=5;// 背包容量vector<pair<int,int>>items={{2,3},{3,4},{4,5}};// (重量, 价值)intmax_value=knapsack_01(W,items);cout<<"最大价值: "<<max_value<<endl;// 输出: 7return0;}

代码解析
输入参数:
W:背包的最大容量。
items:物品列表,每个物品是一个 pair<int, int>,分别表示重量和价值。
动态规划表 dp:
dp[i][j] 表示前 i 个物品在背包容量为 j 时的最大价值。
初始化时,dp 表的所有值设为 0。
状态转移:
不选第 i 个物品:dp[i][j] = dp[i-1][j](直接继承前 i-1 个物品的结果)。
选第 i 个物品:如果 w <= j,则 dp[i][j] = dp[i-1][j - w] + v(装入当前物品,价值增加 v,但容量减少 w)。
最终取两者的最大值:
cpp
dp[i][j] = max(dp[i-1][j], dp[i-1][j - w] + v);
初始化:
dp[0][j] = 0(没有物品时价值为 0)。
dp[i][0] = 0(容量为 0 时无法装任何物品)。
结果:
dp[n][W] 即为前 n 个物品在容量 W 时的最大价值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 19:51:11

收藏!大模型时代,产品经理如何突破成长天花板?

大模型革命使人机交互从"用户适配机器"转变为"机器适配用户"&#xff0c;颠覆了传统AI产品经理"场景穷举语义适配"的工作范式。产品经理需从"技术边界理解框架性规划"维度升级能力&#xff0c;掌握大模型基础原理、业务域定义和结构化…

作者头像 李华
网站建设 2026/6/23 0:55:02

在Windows环境下部署Seed-Coder-8B-Base的详细步骤

在Windows环境下部署Seed-Coder-8B-Base的详细步骤 在当今软件开发领域&#xff0c;代码生成AI正从云端服务走向本地化、私有化的部署模式。尤其是在金融、军工、教育等对数据安全要求极高的场景中&#xff0c;开发者越来越倾向于将智能编程助手“握在自己手里”——不依赖网络…

作者头像 李华
网站建设 2026/6/23 19:51:11

C语言中的面向对象思想

1.静态数组管理多个结构体变量对于c语言当一个结构体要创建多个变量时&#xff0c;若我们分开管理就会比较难以管理&#xff0c;但是我们可以通过结构体数组&#xff08;对象数组&#xff09;的形式对其进行管理。我们看下面这段程序&#xff1a;#include <stdio.h> #inc…

作者头像 李华
网站建设 2026/6/23 19:53:42

微信视频号直播弹幕抓取技术实现与架构解析

微信视频号直播弹幕抓取技术实现与架构解析 【免费下载链接】wxlivespy 微信视频号直播间弹幕信息抓取工具 项目地址: https://gitcode.com/gh_mirrors/wx/wxlivespy 在直播数据获取领域&#xff0c;微信视频号直播弹幕抓取面临诸多技术挑战&#xff1a;数据加密传输、用…

作者头像 李华
网站建设 2026/6/23 6:57:25

火山引擎AI大模型平台迁移至Qwen3-VL-30B的成本效益分析

火山引擎AI大模型平台迁移至Qwen3-VL-30B的成本效益分析 在智能文档处理、金融投研辅助和医疗影像解读等专业场景中&#xff0c;企业对“能看懂图、会推理、可解释”的AI系统需求正迅速攀升。传统的OCR规则引擎组合早已力不从心——它们能提取数字&#xff0c;却无法理解“为何…

作者头像 李华
网站建设 2026/6/23 19:46:19

Linux挂载核心:一文搞懂fstab的作用与配置实战

用过Linux的同学多少都碰过挂载问题&#xff1a;插入U盘后找不到文件、重启后之前挂载的分区消失了、修改挂载配置后系统启动失败... 这些问题大多都和一个关键文件有关——/etc/fstab。今天就从基础到实战&#xff0c;把fstab的作用、配置逻辑和避坑技巧讲透&#xff0c;让你彻…

作者头像 李华