回溯法 —— 求解0/1背包问题(剪枝)

0/1背包问题(回溯法、分支限界法、动态规划法、贪心法)(C++版) 此篇整理自李老师上课PPT           --- On one way by myself(1)问题描述    有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。输入:3          ... 阅读详情
AI摘要

本文通过回溯法详细解析0/1背包问题的求解过程,介绍如何选取部分物品放入背包以达到最大价值的同时不超过背包容量。通过具体实例展示了解空间树的构建与剪枝优化。

0/1背包问题

题目描述:

有n个重量分别为w1,w2,…,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,…,vn,给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么选不中,要求选中的物品不仅能够放到背包中,而且具有最大价值,并对下表所示4个物品求出W=6时的所有解和最佳解。

在这里插入图片描述

分析思路:回溯法

设n件物品重量分别为w1,w2,…,wn的物品,用数组w[1 … n]存放,物品的价值分别为v1,v2,…,vn,用数组v[n]存放;限制重量用W表示。用x[1 … n]数组存放最优解,其中每个元素取1或0,x[i]=1表示第i个物品放入背包中,x[i]=0表示第i个物品不放入背包中。

最优解问题,显然其解空间是子集树(每个物品要么装入,要么不装入),每个结点表示背包的一种选择状态,记录当前放入背包的物品总重量和总价值,每个分枝结点下面有两条边表示对某物品是否放入背包的两种可能选择。

第i层上的某个分枝结点的对应状态为dfs(1,tw,tv,op),其中
tw:表示装入背包中的的物品总重量
tv:表示背包中物品总价值
op:记录一个解向量

时间复杂度:O(2^n)

该状态两种扩展如下:

(1)选择第i个物品放入背包中:op[i]=1,tw=tw+w[i],tv=tv+v[i],转向下一个状态dfs=(i+1,tw,tv,op).该对策对应左分枝

(2)不选择第i个物品放入背包:op[i]=0,tw=tw不变,tv不变,转向下一个状态dfs=(i+1,tw,tv,op).该对策对应右分枝

叶子结点表示已经对n个物品做了决策,对应一个解。对所有叶子结点进行比较求出满足tw=W的最大tv(用maxw表示),将对应的最优解op存放到x中

对于表4.2所示的4个物品,在限制背包总重量W=6时描述问题求解过程的解空间树如图所示,每个结点中的两个数值为(tw,tv)

对于层次为1的根结点为(0,0),考虑物品1

(1)选择物品1:op[1]=1,tw=0+5,tv=0+4,产生新结点(5,4)作为根的左孩子

(2)不选择物品1:op[1]=0,tw=0,tv=0,产生新结点(0,0)作为根的右孩子

在这里插入图片描述

对于层次2的(5,4)结点,考虑物品2

(1)选择物品2:op[2]=1,tw=5+3=8,tv=4+4=8,产生新结点(8,8)作为其左孩子。

(2)不选择物品2:op[2]=0,tw=5,tv=4,产生新结点(5,4)作为其右孩子。

这样可构造出整棵子集树31个结点

递归代码:

#include<stdio.h>
#define MAXN 20  //最多20个物品 

int  n=4;   //4种物品 
int W=6;   //最大重量6 
int w[]={
   
   0,5,3,2,1};  //存放4个物品重量,下标为0元素不用 
int v[]={
   
   0,4,4,3,1};  //存放4个物品价值,下标为0元素不用 

int x[MAXN];  //最终解 
int maxv;   //最优解 
void dfs(
ACM 学习笔记(七) 贪心 文章目录题目考点 题目 考点 阅读详情

相关推荐

回溯法解决0-1背包问题

回溯法解决0-1背包问题

nature_XD的专栏 9263

驱动钛丝(SMA)的应用(5)汽车腰托气阀常见问题及解决方案

财哥在前段时间发布的《驱动钛丝(SMA)的应用(1)汽车腰托支撑按摩气阀模块》一文,引发了很多企业的拜访和交流。 目前很多厂家已经启动或正在进行相关研发,同时也遇到了诸如:钛丝选型、驱动位移、响应设计、温度控制、力量设计、点动滞后、铆接工艺、量化生产等问题。

weixin_39168671的博客 1243

手把手教你用Verilog实现MDIO控制器(附完整VHDL代码对比)

本文详细介绍了如何使用Verilog实现MDIO控制器,并提供了与VHDL实现的深度对比。通过解析MDIO协议核心要点,展示Verilog状态机架构设计和关键时序控制逻辑,同时对比VHDL在信号声明、状态机实现和双向端口处理上的差异。适用于以太网硬件设计开发者,帮助掌握MDIO控制器自主实现能力。

weixin_30682415的博客 422

24位ADC的精度陷阱:为什么你的ADS1232实测性能不达标?

本文深入探讨了24位ADC芯片ADS1232在实际应用中性能不达标的原因,揭示了高精度ADC性能依赖周边电路设计的关键问题。通过分析电源系统、参考电压稳定性、PCB布局等常见陷阱,提供了优化方案和调试技巧,帮助工程师充分发挥ADS1232的潜力,实现接近理论值的测量精度。

weixin_28285943的博客 407

Fleury算法寻找欧拉回路(mtlab代码详解)

【代码】Fleury算法寻找欧拉回路(mtlab代码详解)

m0_63449998的博客 1297

在RV1126上实现人脸识别----MobileFaceNet转成rknn模型

目录 1.模型下载 2 转成rknn模型并推理 3 查看网络模型 1.模型下载 首先下载MobileFaceNet的模型,github下载地址为:https://github.com/sirius-ai/MobileFaceNet_TF/tree/master/arch/pretrained_model/ 2 转成rknn模型并推理 import numpy as np import cv2 from rknn.api import RKNN if __name__ == '__..

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3528

企业级OpenClaw部署实战:10个关键配置让你从“养虾“到“精通“

OpenClaw(社区昵称"小龙虾")作为2026年开源社区最活跃的AI Agent项目,凭借其多Agent协同架构和企业级安全隔离能力,已成为中大型企业的首选AI基础设施。本文基于真实企业部署经验,系统梳理了企业级OpenClaw部署的10个关键配置:用户ID消息隔离、群组ID消息隔离、多机器人配置、无限量Agent创建、机器人与Agent关联、Agent间调度、权限配置、Hooks任务、多模型切换及一键备份迁移。

program哲学 931

AD22等长布线规则

本文介绍了PCB布线中实现信号线等长的详细操作步骤:1.创建网络类(NetClass),将需要等长的信号线归入同一组;2.设置高速布线规则(High-SpeedRule),定义等长容差等参数;3.进行交互式等长布线(InteractiveLengthTuning),使用蛇形线调整线长;4.实时调整与最终检查,确保所有网络满足等长要求。文中还提供了实用技巧,如使用快捷键调整蛇形线参数、为关键信号设置更严格规则等。操作需在PCB设计软件中完成,通过统一管理、规则设置和精确调整来实现信号同步传输。

whm128的博客 1557

海思图像质量之HiPQTool调试

文章目录一. HiPQTool 界面二. 图像调试三. 将调试参数写入程序中 一. HiPQTool 界面 二. 图像调试 三. 将调试参数写入程序中

lzg2011的博客 2382

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列
下一篇: 回溯法 —— 求解子集和问题
Serendipity_筱楠
博客等级 码龄8年 2万+粉丝 272原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值