回溯法 —— 求解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

基于STM32的智能循迹小车设计(基础版)

基于STM32的智能循迹小车设计 硬件准备 1、小车底盘+四直流电机(带轮) 2、STM32F103C8T6核心板 3、12V 8700mAh锂电池(可以用几节18650锂电池) 4、循迹模块 选择的是TCRT500L,五路集成在一起,集成度比较高,但是可能不如五个单独的循迹模块好用 5、L298N电机驱动模块 四驱车为啥用L298N电机驱动模块? 可以把左边的两个电机并联,用输出A控制。把右边的两个电机并联,用输出B控制。 12V供电接电源正极,供电GND接电源负极和核心板GND,5V供电接核心

Rendezvous1的博客 3万+

森林冰火人html源码,森林冰火人单人版(源码)

【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ...

weixin_42507981的博客 6201

Photoshop实战技巧(9)——高效去除复杂水印的五种进阶方法

本文详细介绍了Photoshop中高效去除复杂水印的五种进阶方法,包括色阶通道爆破法、频率分离高阶应用、智能填充+手动修复组合拳等专业技巧。针对半透明水印、密集文字水印等复杂场景,提供分步操作指南和实战案例,帮助用户精准去除水印同时保留原始图像细节,大幅提升工作效率。

cake8的博客 961

10天冲刺国自然基金!用这套实战AI提示词指令教程,助你中标率翻倍!亲测DeepSeek和ChatGPT不好用

虽然以上国自然提示词指令经过反复实测,但并不是万能无脑帮你搞定所有,大模型AI的特性是你专业领域能力越强,它的智商表现就会更加强大,通过以上提示词教程的使用,大大提升中标概率是肯定的。还有就是大模型的使用上,不是市面上大家都说好的就一定适用,目前来看,Gemini和Claude的两个模型是非常适合国自然本子的修改的。在使用大模型进行国自然本子撰写修改时,首先是角色的设定,然后是目标和背景的描述,好用的提示词指令都是要经过无数次的实测,比对输出结果后又反复调整,达到最佳的效果状态的提示词指令。

智能AI让学术科研更容易 1247

51单片机 驱动有源/无源蜂鸣器+Proteus仿真

51单片机 驱动有源/无源蜂鸣器+Proteus仿真 相关篇《51单片机 Proteus仿真有源蜂鸣器始终不响原因及解决方法》 电路搭建 采用NPN管驱动有源蜂鸣器电路 采用PNP管驱动有源蜂鸣器电路 采用PNP管驱动无源蜂鸣器 采用NPN管驱动无源蜂鸣器 Proteus元器件列表 实例代码 /************************************************************************************* * 实验现象:下载程序

perseverance51博客 2万+

Python爬虫实战:利用Playwright+Asyncio高效获取淘宝商品价格变化曲线

本文将详细介绍如何使用Python最新技术栈(Playwright+Asyncio)构建一个高效的淘宝商品价格监控爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、数据存储与分析,最终实现价格变化曲线的可视化展示。文章包含完整的代码实现和详细的技术解析,适合中高级Python开发者学习参考。关键词:Python爬虫、Playwright、Asyncio、淘宝价格监控、数据可视化支持多浏览器(Chromium, Firefox, WebKit)更快的执行速度更丰富的API。

2201_76125261的博客 245

电子元件及其规格书的查找与理解

本内容收录:在电子开发或维修过程中,查找电子元件及其规格书心得体会,以及元件规格书的理解,系个人多年实战经验的系统梳理。内容着重介绍贴片元件代码反查型号的实用技巧,并以三款典型疑难元件为例,详述其完整查找过程与最终型号确认。

让你爱上电路设计 3995

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现

在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 273

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 回溯法——设计一个算法在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、付费专栏及课程。

余额充值