当前位置: 首页 > news >正文

算法-动态规划-0-1背包问题(二维0-1背包,背包求方案数,求背包具体方案)

概念

背包问题(Knapsack Problem)是算法领域的经典组合优化问题,在资源分配等场景有广泛应用,以下从定义、常见类型、解决方法等方面介绍:

定义

给定一组物品,每个物品都有自己的重量和价值,在限定背包容量的情况下,如何选择物品放入背包,使得装入背包的物品总价值最大,同时不超过背包的容量限制。

常见类型

|0 - 1 背包问题:每个物品只有取或不取两种状态(1 表示取,0 表示不取),不能取部分物品。例如,有多个不同重量和价值的宝石,背包容量有限,决定选取哪些宝石能获得最大价值。

|完全背包问题:每个物品可以无限次选取。比如商店里有不同价格和体积的商品,购物袋容量固定,考虑每种商品购买多少件能使总价值最高。

|多重背包问题:每个物品有一定的数量限制,只能在数量范围内选取。像仓库里有不同类型且数量有限的货物,卡车运载量有限,决定装载哪些货物能实现最大收益。

0-1背包

问题描述

有(N)件物品和一个容量为(V)的背包。每件物品有两个属性,第(i)件物品的费用(占用背包的容量)是(c(i)),价值是(w(i))。需要求解将哪些物品装入背包,可使这些物品的费用总和不超过背包容量,且价值总和最大。

问题特点

每种物品只有一件,可以选择放或者不放,不存在取部分物品的情况,这也是 “0 - 1” 的含义,0 代表不放,1 代表放。

算法基本思想

通常利用动态规划思想求解。

定义子问题:(f(i)(v))表示前(i)件物品放入一个容量最多为(v)的背包可以获得的最大价值。 其状态转移方程为:(f(i)(v)=max{f(i - 1)(v),f(i - 1)(v - c(i)) + w(i)}) 。该方程的含义是,“将前(i)件物品放入容量为(v)的背包中” 这一问题,若只考虑第(i)件物品放或者不放,可转化为只涉及前(i - 1)件物品的问题:

|不放第(i)件物品:问题转化为 “前(i - 1)件物品放入容量为(v)的背包中”,此时最大价值为(f(i - 1)(v)) 。

|放第(i)件物品:问题转化为 “前(i - 1)件物品放入剩下的容量为(v - c(i)\)的背包中”,此时能获得的最大价值是(f(i - 1)(v - c(i)))再加上放入第(i)件物品获得的价值(w(i)) 。 (f(i)(v))的值取上述两种情况中的最大值。按照这个方程递推完毕后,最终的答案是(f(N)(V)),如果我们定义的子问题是前(i)件物品放入一个容量恰好为(v)的背包可以获得的最大价值,那么答案是(f(N)(0..V))中的最大值(因为(f(i)(v))有意义当且仅当存在一个前(i)件物品的子集,其费用总和为(v) )。

引例:

分析:

这是一道以故事为背景的算法问题。主人公辰辰梦想成为伟大医师,为拜师,医师带他到满是草药的山洞,给出采药时间限制。每株草药有各自的采摘耗时和价值,要求辰辰在给定时间内采摘草药,使总价值达到最大。本质上是一个 0 - 1 背包问题,采药时间相当于背包容量,草药的采摘耗时和价值分别对应物品的重量和价值,需在时间限制内选择合适的草药(物品),以获取最大总价值。

 这是最简单的背包模型的变种,解题模版如下;

由于第i行的状态只和第i-1行有关,所以可以用滚动数组进行优化:

 习题1:

分析:

给定一个容量为\(V\)的箱子以及\(n\)个具有各自体积(正整数)的物品。目标是从这\(n\)个物品中选取若干个装入箱子,使得箱子剩余的空间最小。这等价于在箱子容量限制下,尽可能多地装入物品体积,即最大化已装入物品的总体积,类似于 0 - 1 背包问题中在背包容量限制下最大化物品总价值,只不过这里的 “价值” 体现为物品体积。通过合理选择物品的组合来实现对箱子空间的最优利用,需要运用算法策略如动态规划等求解。

这是一个背包问题的变种,要求我们去求出最小的剩余的空间,本质不就是求出能够得到的最大的体积吗?所以这里的价值就是体积。我们的f[i][j]还是表示的前i个物品,体积不超过j所能获得的最大的价值,答案就是v-f[n][v],利用滚动数组来优化一下空间,答案就是v-f[v]

伪代码如下:

习题2(二维0-1背包):

分析:

这是一个二维0-1背包问题,我们纪要去关注皮卡丘的体力,也要去关注精灵球的数量,所以有两个花费,我们的关注的子问题就是f[i][j][k],即只抓前i个小精灵,花费不超过j个精灵球,体力消费不超过k所能抓住的最多的小精灵数量。

因为还要求花费最少的体力,所以我们要找到最小的k使得f[N][M][k]==f[N][M][K]

使用滚动数组可以优化第一维

伪代码:

习题3(求方案数):

分析

我们的子问题f[i][j]表示的是前i个数,组成数j的方案数

这是一个求方案数的0-1问题,特殊的点是初始化的时候,我们对f[0][0]的初始化为1,f[0][j],(j!=0)为0.

状态转移方程是f[i][j]=f[i-1][j]+f[i-1][j-c[i]](不选第i个数组成j的方案数 + 选择第i个数组成j的方案数)

伪代码如下

习题4:(求具体方案)

分析:

这是一道典型的 0 - 1 背包问题拓展题目。给定 (N) 件物品和一个容量为 (V) 的背包,每件物品仅能使用一次,第 (i) 件物品具有体积(v_i) 和价值 (w_i) 两个属性。

需找出将哪些物品装入背包,能使物品总体积不超背包容量 \(V\) 的同时,总价值达到最大。并且,在满足总价值最大的众多方案中,要输出所选物品编号构成序列的字典序最小的方案。

相比普通 0 - 1 背包问题仅需计算最大价值,本题额外增加了输出字典序最小方案的要求,这使得解题过程不仅要考虑价值最优,还需在回溯确定选取物品时,按照字典序规则来选择方案。

我们要根据我们自己的转移方程来确定转移的方向:

伪代码:

相关文章:

算法-动态规划-0-1背包问题(二维0-1背包,背包求方案数,求背包具体方案)

概念 背包问题(Knapsack Problem)是算法领域的经典组合优化问题,在资源分配等场景有广泛应用,以下从定义、常见类型、解决方法等方面介绍: 定义 给定一组物品,每个物品都有自己的重量和价值,…...

位运算算法篇:位运算实现加减乘除

位运算算法篇:位运算实现加减乘除 那么我们想必对加减乘除这些数学计算并不陌生,但是对于我们的计算机来说,由于机器只能识别二进制的语言,那么我们底层的数据都是以二进制的形式存在,那么我们CPU的计算器的加减乘除运…...

【故障处理】ORA-19849 ORA-19612 0RA-17627 ORA-03114

【故障处理】ADG duplicate 异常中断ORA-19849 ORA-19612 0RA-17627 ORA-03114 Corrupt block 84629 found during reading backup piece 一、概述二、报错信息三、报错原因四、解决方法五、其他类似报错5.1 报错信息 一、概述 部署adg执行duplicate异常中断,RMAN过…...

【MQ】Spring3 中 RabbitMQ 的使用与常见场景

一、初识 MQ 传统的单体架构,分布式架构的同步调用里,无论是方法调用,还是 OpenFeign 难免会有以下问题: 扩展性差(高耦合,需要依赖对应的服务,同样的事件,不断有新需求&#xff0…...

jupyterLab插件开发

jupyter lab安装、配置: jupyter lab安装、配置教程_容器里装jupyterlab-CSDN博客 『Linux笔记』服务器搭建神器JupyterLab_linux_布衣小张-腾讯云开发者社区 Jupyter Lab | 安装、配置、插件推荐、多用户使用教程-腾讯云开发者社区-腾讯云 jupyterLab插件开发教…...

拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动

拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动 1. 前情: 1TB的硬盘,分了120G作ubuntu22.04。/boot: 300MB, / : 40GB, /home: 75G, 其余作swap area。 2. 一开始按这个教程:对我无效 https://blog.csdn.net/Eric_xkk/article/details/1…...

QT-常见问题

1. C(特别是 Qt)开发中,内存优化的方法 1. 合理管理对象生命周期,使用智能指针 Qt 提供了 QScopedPointer 和 QSharedPointer 来管理对象生命周期,避免手动 delete 导致的内存泄漏。 2. 减少内存占用 QString、QBy…...

如何通过腾讯 ima.copilot 训练自己的知识库

如何通过腾讯 ima.copilot 训练自己的知识库 在信息爆炸的时代,拥有一个专属的知识库,能让我们在学习、工作中快速获取所需信息,极大地提升效率。腾讯推出的 AI 智能工作台 ima.copilot,为我们打造个人知识库提供了便利。今天&am…...

关于近期我的交流之深度思考DeepSeek归纳总结

以下内容我摘自昨天 2025-2-9 群里的讨论,只涉及我的观点内容,会让DeepSeek进行深度思考 抢财猫: 能提出一个好问题不容易的,问题边界包含了所有认知,提问题需要能力的 抢财猫: 每个人都相当于一个大模型,自己给自己投入了多少算力,训练了多少数据参数,自己心里有数…...

智能生鲜配送管理系统:生鲜及快消品行业的数字化转型利器

在生鲜及快消品行业,高效的供应链管理是企业成功的关键。随着科技的不断进步,越来越多的企业开始采用智能化管理软件来提升运营效率、降低成本并优化客户体验。今天,我们就来了解一下这类智能生鲜配送管理系统的核心功能和技术优势&#xff0…...

DeepSeek和ChatGPT的优劣或者区别(答案来DeepSeek和ChatGPT)

DeepSeek的答案 DeepSeek与ChatGPT作为当前两大主流AI模型,在架构设计、性能表现、应用场景等方面存在显著差异,以下从多个维度进行对比分析: 一、架构与训练效率 架构设计 DeepSeek:采用混合专家(MoE)框架…...

【C语言标准库函数】标准输入输出函数详解[5]:格式化文件输入输出

目录 一、fprintf() 函数 1.1. 函数简介 1.2. fprintf使用场景 1.3. 注意事项 1.4. 示例 二、fscanf() 函数 2.1. 函数简介 2.2. fscanf使用场景 2.3. 注意事项 2.3. 示例 三、总结 在 C 语言中,格式化文件输入输出函数能够让我们以特定的格式对文件进行…...

[概率论] 随机变量

Kolmogorov 定义的随机变量是基于测度论和实变函数的。这是因为随机变量的概念需要精确地定义其可能的取值、发生的概率以及这些事件之间的依赖关系。 测度论:在数学中,测度论是用来研究集合大小的理论,特别是无穷可数集和无界集的大小。对于…...

中国通信企业协会通信网络安全服务能力评定安全设计与集成服务能力评定三级要求准则...

安全设计与集成服务能力三级是通信网络安全服务能力评定安全设计与集成服务能力评定的最高等级,所需的要求也会更加严苛,不仅要满足安全设计与集成服务二级能力要求的所有条款,还要满足以下要求: 规模与资产要求 1)单位正规编制员…...

【C++语言】类和对象(下)

一、再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…...

【Spring】什么是Spring?

什么是Spring? Spring是一个开源的轻量级框架,是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…...

全面理解-c++11中的智能指针

在 C 中,智能指针(Smart Pointers) 是用于自动管理动态分配内存的类模板,遵循 RAII(Resource Acquisition Is Initialization) 原则,确保资源在生命周期结束时被正确释放,避免内存泄…...

【jmeter】在windows中,创建的变量,在jmeter中,读取变量失败的问题,路径问题

1.0 在windows中,jmeter读取变量失败 在路径配置的时候,配置按照D:\FtpDownload\${file_name}运行之后,下载的文件,文件名出现问题 \取消了$符号的意义,所以需要更改路径 D:\\FtpDownload\\${file_name}...

【CubeMX-HAL库】STM32F407—无刷电机学习笔记

目录 简介: 学习资料: 跳转目录: 一、工程创建 二、板载LED 三、用户按键 四、蜂鸣器 1.完整IO控制代码 五、TFT彩屏驱动 六、ADC多通道 1.通道确认 2.CubeMX配置 ①开启对应的ADC通道 ②选择规则组通道 ③开启DMA ④开启ADC…...

使用 POI-TL 和 JFreeChart 动态生成 Word 报告

文章目录 前言一、需求背景二、方案分析三、 POI-TL JFreeChart 实现3.1 Maven 依赖3.3 word模板设置3.2 实现代码 踩坑 前言 在开发过程中,我们经常需要生成包含动态数据和图表的 Word 报告。本文将介绍如何结合 POI-TL 和 JFreeChart,实现动态生成 W…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...