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

九种背包问题(C++)

0-1背包,背包大小target,占用容积vec[i][0],可以带来的利益是vec[i][1]
一件物品只能取一次,先遍历物品然后遍历背包更新不同容积下最大的利益

int func(vector<vector<int>>&vec,int target){vector<int>dp(target+1,0);for(int i=0;i<vec.size();i++){for(int w=target;w>=vec[i][0];w--){dp[w]=max(dp[w-vec[i][0]]+vec[i][1],dp[w]);}}return dp[w];
}

完全背包,与0-1背包相比差别在于物品可以多次选择了
思路和0-1背包差不多,只不过遍历背包容积时从低到高,每次更新时之前都是包含当前物品最优

int func1(vector<vector<int>>&vec,int target){vector<int>dp(target+1,0);for(int i=0;i<vec.size();i++){for(int w=vec[i][0];w<=target;w++){dp[w]=max(dp[w-vec[i][0]]+vec[i][1],dp[w]);}}return dp[w];
}

多重背包,每种物品有vec[i][j][2]个
思路1,二进制商品拆分(比如:111可以组合成1-6任意数字),转化为0-1背包问题

int func2(vector<vector<int>>&vec,int target){int n=vec.size();vector<pair<int,int>>goods;for(auto&i:vec){for(int j=1;j<=i[2];i*=2){i[2]=i[2]-j;goods.push_back({i[0]*j,i[1]*j});}goods.push_back({i[2]*i[0],i[2]*i[1]});}vector<int>dp(target+1,0);for(int i=0;i<goods.size();i++){for(int j=target;j>=goods[i].first;j--){dp[j]=max(dp[j],dp[j-goods[i].first]+goods[i].second);}}return dp[target];
}

思路2 添加物品数量层遍历

int func3(vector<vector<int>>&vec,int target){vector<int>dp(target+1,0);for(int i=0;i<vec.size();i++){for(int j=target;j>=vec[i][0];j--){for(int k=1;k*vec[i][0]<j&&k<=vec[i][2];k++){dp[j]=max(dp[j],dp[j-k*vec[i][0]]+k*vec[i][1]);}}}return dp[target];
}

混合背包,背包中的物品可以有无限个或者有限个
vec[i][0]重量,vec[i][1]价值,vec[i][2]数量

int func4(vector<vector<int>>&vec,int target){vector<int>dp(target+1,0);for(int i=0;i<vec.size();i++){if(vec[i][2]==0){for(int j=vec[i][0];j<=target;j++){dp[j]=max(dp[j],dp[j-vec[i][0]]+vec[i][1]);}}else {for(int j=target;j>=vec[i][0];j--){for(int k=1;k*vec[i][0]<j&&k<=vec[i][2];k++){dp[j]=max(dp[j],dp[j-k*vec[i][0]]+k*vec[i][1]);}}}}return dp[target];
}

分组背包
商品分组,每组最多只能选一个,vec[i][k][0]重量,vec[i][k][1]价值

int func5(vector<vector<vector<int>>>&vec,int target){vector<int>dp(target+1,0);for(int i=0;i<vec.size();i++){for(int j=target;j>=0;j--){//遍历背包容积for(int k=0;k<vec[i].size();k++){//遍历商品组内商品if(j>=vec[i][k][0]) dp[j]=max(dp[j],dp[j-vec[i][k][0]]+vec[i][k][1]);}}}return dp[target];
}

二维背包
约束条件增加,vec[i][0]价值,vec[i][1]是第一个约束条件,vec[i][2]是第二个约束条件

int func6(vector<vector<int>>&vec,int target1,int target2){vector<vector<int>>dp(target1+1,vector<int>(target2+1,0));for(int i=0;i<vec.size();i++){for(int j=target1;j>=vec[i][1];j--){for(int k=target2;k>=vec[i][2];k--){dp[j][k]=max(dp[j][k],dp[j-vec[i][1]][k-vec[i][2]]+vec[i][0]);}}}return dp[target1][target2];
}

树状背包
买一件物品前必须买另一件
map键值是编号,first负重,second价值,买d[i][0]前必须买d[i][1],d[i][1]=0时表示没有依赖
思路,回溯思想自底向上遍历,每一层子树作为一个临时的商品组,根节点必须买,根节点买不了时更新为0
原理是把一棵树分为整合为前缀和组,实现起来保证每种情况更新到且在回溯前更新完即可
注意更新的数据所在的层级

int func7(unordered_map<int,pair<int,int>>&map,vector<vector<int>>&d,int target){int n=map.size();vector<vector<int>>tree(n+1);vector<vector<int>>dp(n+1,vector<int>(target+1));for(auto i:d){tree[i[1]].push_back(i[0]);}function<void(int)>dfs=[&](int root){for(int i=0;i<tree[root].size();i++){//遍历商品组int son=tree[root][i];dfs(son);for(int j=target-map[root].first;j>=map[son].first;j--){//商品组内不应该包含根节点,所以需要保留for(int k=0;k<=j;k++){//对商品的抽象,直接抽象为了对应的大小,不存在时为0dp[root][j]=max(dp[root][j],dp[root][j-k]+dp[son][k]);}}}for(int j=target;j>=map[root].first;j--)//根节点必须买 dp[root][j]=dp[root][j-map[root].first]+map[root].second;for(int j=0;j<map[root].first;j++) //根节点买不了的话gdp[root][j]=0;};dfs(0);return dp[0][target];
}

小数/分数背包,贪心
物品可以选择部分
vec[i][0]重量,vec[i][1]价值

int func8(vector<int>&vec,int target){sort(vec.begin(),vec.end(),[](vector<int>&v1,vector<int>&v2){return v1[1]*1.0/v1[0]>v2[1]*1.0/v2[0];});int value=0;for(int i=0;i<vec.size()&&target;i++){if(target>vec[i][0]){target-=vec[i][0];value+=vec[i][1];}else {value+=target*vec[i][1]*1.0/vec[i][0];target=0;}}return value;
}

泛化背包问题
没有固定代价和价值

int value(int index){...}
int weight(int index){...}
int func9(int size,int target){vector<int>dp(target+1,0);for(int i=0;i<size;i++){for(int w=target;w>=weight(i);w--){dp[w]=max(dp[w],dp[w-weight(i)]+value(i));}}return dp[target];
}

相关文章:

九种背包问题(C++)

0-1背包&#xff0c;背包大小target&#xff0c;占用容积vec[i][0]&#xff0c;可以带来的利益是vec[i][1] 一件物品只能取一次,先遍历物品然后遍历背包更新不同容积下最大的利益 int func(vector<vector<int>>&vec,int target){vector<int>dp(target1,…...

008:安装Docker

安装Docker 如果不太熟悉Linux命令&#xff0c;不想学习Linux命令&#xff0c;可以直接看文末NAS面板章节&#xff0c;通过面板&#xff0c;像使用Window一样操作NAS。 一、安装 Docker 1.安装 Docker wget -qO- https://get.docker.com/ | sh2.启动 Docker 服务 sudo sys…...

STM32第九节(中级篇):RCC(第一节)——时钟树讲解

目录 前言 STM32第九节&#xff08;中级篇&#xff09;&#xff1a;RCC——时钟树讲解 时钟树主系统时钟讲解 HSE时钟 HSI时钟 锁相环时钟 系统时钟 SW位控制 HCLK时钟 PCLKI时钟 PCLK2时钟 RTC时钟 MCO时钟输出 6.2.7时钟安全系统(CSS&#xff09; 小结 前言 从…...

Web核心,HTTP,tomcat,Servlet

1&#xff0c;JavaWeb技术栈 B/S架构:Browser/Server&#xff0c;浏览器/服务器架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源…...

空间(Space)概念:元素、集合、空间和数学对象

摘要&#xff1a; 在数学中&#xff0c;一个空间&#xff08;Space&#xff09;是一种特殊类型的数学对象。它通常是一个集合&#xff0c;但不仅仅是一个普通的集合&#xff0c;而是具有某种附加的结构和定义在其上的运算规则。这些额外的结构使得空间能够反映现实世界中的几何…...

【Datawhale组队学习:Sora原理与技术实战】训练一个 sora 模型的准备工作,video caption 和算力评估

训练 Sora 模型 在 Sora 的技术报告中&#xff0c;Sora 使用视频压缩网络将各种大小的视频压缩为潜在空间中的时空 patches sequence&#xff0c;然后使用 Diffusion Transformer 进行去噪&#xff0c;最后解码生成视频。 Open-Sora 在下图中总结了 Sora 可能使用的训练流程。…...

Kafka-生产者报错javax.management.InstanceAlreadyExistsException

生产者发送消息到 kafka 中,然后控制台报错 然后根据日志查看 kafka 的源码发现了问题原因 说的是MBean已经注册了,然后报异常了,这样就会导致生产者的kafka注册失败, 原因是项目上生产者没有配置clientId,默认都是空导致的, 多个生产者(项目)注册到kafka集群中的 id 都相同。 …...

Java常见问题:编辑tomcat运行环境、部署若伊系统

文章目录 引言I Eclipse1.1 编辑tomcat运行环境II JDK2.1 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接2.2 restriction on required library2.3 The type javax.servlet.http.HttpServletRequest cannot be resolved.的解决方法III npm3.1 npm报错:…...

阿里云免费证书改为3个月,应对方法很简单

情商高点的说法是 Google 积极推进90天免费证书&#xff0c;各服务商积极响应。 情商低点的话&#xff0c;就是钱的问题。 现在基本各大服务商都在2024年停止签发1年期的免费SSL证书产品&#xff0c;有效期都缩短至3个月。 目前腾讯云倒还是一年期。 如果是一年期的话&#x…...

安装Pytorch——CPU版本

安装Pytorch——CPU版本 1. 打开pytorch官网2. 选择pip安装pytorch-cpu3.复制安装命令4. 在cmd命令窗口&#xff0c;进入你的虚拟环境4.1 创建虚拟环境4.2 进行安装 5. 安装成功6. 进行测试——如下面步骤&#xff0c;如图6.1 输入 python6.2 输入 import torch6.2 输入 print …...

MySQL中出现‘max_allowed_packet‘ variable.如何解决

默认情况下&#xff0c;MySQL的max_allowed_packet参数可能设置得相对较小&#xff0c;这对于大多数常规操作来说足够了。但是&#xff0c;当你尝试执行包含大量数据的操作&#xff08;如大批量插入或大型查询&#xff09;时&#xff0c;可能会超过这个限制&#xff0c;从而导致…...

PHP 生成图片

1.先确认是否有GD库 echo phpinfo(); // 创建一个真彩色图像 $image imagecreatetruecolor(120, 50);// 分配颜色 $bgColor imagecolorallocate($image, 255, 255, 255); // 白色背景 $textColor imagecolorallocate($image, 230, 230, 230); // 黑色文字// 填充背景 image…...

【Spring Boot 3】【JSON】读取JSON文件

【Spring Boot 3】【JSON】读取JSON文件 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...

网络学习:邻居发现协议NDP

目录 前言&#xff1a; 一、报文内容 二、地址解析----NS/NA 目标的被请求组播IP地址 邻居不可达性检测&#xff1a; 重复地址检测 路由器发现 地址自动配置 默认路由器优先级和路由信息发现 重定向 前言&#xff1a; 邻居发现协议NDP&#xff08;Neighbor Discovery…...

Spring事务传播行为总结

事务传播行为介绍 Spring中的7个事务传播行为: ​ 事务行为说明特点PROPAGATION_REQUIRED支持当前事务&#xff0c;假设当前没有事务。就新建一个事务父事务与子事务要么都成功&#xff0c;要么都失败PROPAGATION_SUPPORTS支持当前事务&#xff0c;假设当前没有事务&#xff0…...

AWTK slider_circle 控件发布

slider_circle 控件。 主要特色&#xff1a; 支持正向和反向支持设置滑块的半径支持背景线宽和颜色支持前景线宽和颜色支持设置是否显示值的文本支持设置起始角度和结束角度支持设置格式化值的格式字符串支持使用图片填充背景和前景 界面效果&#xff1a; 注意&#xff1a; …...

BitMap 和 HyperLogLog

目录 BitMap 常用命令 应用场景 日活统计 用户签到 HyperLogLog 什么是基数? 常用命令 应用场景 BitMap 问: "有10亿个不重复的无序的正数&#xff0c;如果快速排序&#xff1f;" 这看上去很简单&#xff0c;就是一个排序而已&#xff0c;但是大部分排序算…...

德人合科技 | 公司办公终端、电脑文件资料 \ 数据透明加密防泄密管理软件系统

天锐绿盾是一款全面的企业级数据安全解决方案&#xff0c;它专注于为企业办公终端、电脑文件资料提供数据透明加密防泄密管理。 首页 德人合科技——www.drhchina.com 这款软件系统的主要功能特点包括&#xff1a; 1. **透明加密技术**&#xff1a; 天锐绿盾采用了透明加密技…...

0基础 三个月掌握C语言(11)

字符函数和字符串函数 为了方便操作字符和字符串 C语言标准库中提供了一系列库函数 接下来我们学习一下这些函数 字符分类函数 C语言提供了一系列用于字符分类的函数&#xff0c;这些函数定义在ctype.h头文件中。这些函数通常用于检查字符是否属于特定的类别&#xff0c;例如…...

【Linux】基础 IO(文件描述符)-- 详解

一、前言 1、文件的宏观理解 文件在哪呢&#xff1f; 从广义上理解&#xff0c;键盘、显示器、网卡、声卡、显卡、磁盘等几乎所有的外设都可以称之为文件&#xff0c;因为 “Linux 下&#xff0c;一切皆文件”。 从狭义上的理解&#xff0c;文件在磁盘&#xff08;硬件&#…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

Shell 解释器​​ bash 和 dash 区别

bash 和 dash 都是 Unix/Linux 系统中的 ​​Shell 解释器​​&#xff0c;但它们在功能、语法和性能上有显著区别。以下是它们的详细对比&#xff1a; ​​1. 基本区别​​ ​​特性​​​​bash (Bourne-Again SHell)​​​​dash (Debian Almquist SHell)​​​​来源​​G…...