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

<背包问题>

背包问题是一类组合优化问题其基本形式是给定一组物品每个物品都有一个重量和一个价值以及一个有限的背包容量目标是在不超过背包容量的前提下选择物品使得背包中的物品价值最大化。动态规划是解决背包问题的常用方法核心思路是“化繁为简”和“避免重复计算”根据物品选择的限制条件不同分为以下几种经典模型01背包每种物品数量为1只能选择拿1或不拿0。题目一个旅行者有一个最多能用m公斤的背包现在有n件物品它们的重量分别是W1W2...,Wn它们的价值分别为C1,C2,...,Cn。若每种物品只有一件求旅行者能获得最大总价值。思路每个物品都有两种选择选与不选。无序变有序依次考虑前1、2、3……个物品背包容量也考虑连续状态。定义dp[i][j]表示前i件物品在背包容量为j时背包的最大总价值。代码#includeiostream #includevector using namespace std; int main(){ int m,n; cinmn; vectorintw(n1); vectorintv(n1); for(int i1;in;i){ cinw[i]v[i]; } // 定义dp[i][j]前i件物品在背包容量为j时背包的最大总价值 int dp[31][201]{0}; for(int i1;in;i){ //遍历每件物品 for(int j1;jm;j){ //遍历可能的背包容量 if(jw[i]){ // 如果能装入当前物品 dp[i][j]max(dp[i-1][j],dp[i-1][j-w[i]]v[i]); }else{ dp[i][j]dp[i-1][j]; } } } coutdp[n][m]; return 0; }还可以用一维数组优化空间时间复杂度还是一样都是n*v每次都在同一个一维数组上操作。定义dp[j]表示前i件物品在容量为j时背包的最大总价值。从大到小遍历不能从小到大遍历不然会重复多次放入同一物品背包容量若不放当前物品则dp为上一次值前i-1个物品若放dp为dp[j-w[i]]v[i]。代码#includeiostream #includevector using namespace std; int main(){ int m,n; cinmn; vectorintw(n1); vectorintv(n1); for(int i1;in;i){ cinw[i]v[i]; } // 定义dp[j]前i个物品在背包容量为j时背包的最大总价值 int dp[201]{0}; for(int i1;in;i){ // 遍历每件物品 for(int jm;jw[i];j--){ // 注意注意从大到小遍历背包容量jc[i]肯定不能放i还是上一次结果 dp[j]max(dp[j],dp[j-w[i]]v[i]); } } coutdp[m]; return 0; }完全背包每种物品有无限个可以拿任意数量题目设有n种物品每种物品有一个重量及一个价值每种物品的数量是无限的。同时有一个背包最大载重量为M今从n种物品中选取若干件(同一种物品可以多次选取)使其重量的和小于等于M而价值的和为最大。思路在01背包的一维数组优化空间解法中我提到 “ 注意注意从大到小遍历背包容量 ”以此来防止重复多次放入同一物品而完全背包刚好就是可以重复选择同一物品来使价值最大化那么我们从小到大遍历背包容量则就满足完全背包题目的目标了。代码#includeiostream #includevector using namespace std; int main(){ int m,n; cinmn; vectorintw(n1); vectorintv(n1); for(int i1;in;i){ cinw[i]v[i]; } // 定义dp[j]前i个物品在背包容量为j时背包的最大总价值 int dp[201]{0}; for(int i1;in;i){ // 遍历每件物品 for(int jw[i];jm;j){ // 遍历背包容量 dp[j]max(dp[j],dp[j-w[i]]v[i]); } } coutdp[m]; return 0; }多重背包每种物品有固定数量限制题目第一行两个数n(n500)m(m6000)其中n代表希望购买的奖品的种数m表示拨款金额。接下来n行每行3个数v、w、s分别表示第i种奖品的价格、价值和购买的数量买0件到s件均可其中v100w1000s10。求此次购买能获得的最大的价值。方法一s较小时转换成01背包因为s10我们可以把 s 件拆成 s 个相同物品变成 0-1 背包#includeiostream using namespace std; // dp[i][j]表示前i件商品金额不超过m时的最大价值 int dp[5001][6001]; int cost[5001],val[5001]; int main(){ int n,m,v,w,s; cinnm; int num1; for(int i1;in;i){ cinvws; while(s--){ cost[num]v; val[num]w; num; } } num--; for(int i1;inum;i){ for(int j1;jm;j){ if(jcost[i]){ dp[i][j]max(dp[i-1][j],dp[i-1][j-cost[i]]val[i]); }else{ dp[i][j]dp[i-1][j]; } } } coutdp[num][m]; return 0; }方法二朴素多重背包还是枚举遍历每种物品 → 倒序遍历背包容量 → 枚举当前物品选几件#includeiostream using namespace std; // dp[j]金额不超过j时的最大价值 int dp[6001]; int main(){ int n,m; cinnm; // 遍历每一种物品 for(int i1;in;i){ int v,w,s; cinvws; // 倒序遍历容量避免重复多选同一件 for(int jm;jv;j--){ // 枚举当前物品选1-s件 for(int k1;ks;k){ // 钱够买k件才更新 if(jk*v){ dp[j]max(dp[j],dp[j-k*v]k*w); } } } } coutdp[m]; return 0; }方法三二进制优化s较大时任何一个正整数s都能用1、2、4、8、16...2的幂次组合出来最多买7件分成1件、2件、4件三包任选组合就能买0~7个奖品0件啥都不拿1件1件2件2件3件1件2件4件4件5件1件4件6件2件4件7件1件2件4件s件 → log₂s 包s越大二进制优化省的数量越多核心步骤对每一种物品把最大数量s拆分成若干个 2 的幂次 剩余数如 1,2,4,2每一个幂次打包成一个大物品比如2个一包价格2×v价值2×w4个一包价格4*v价值4*w......对所有大物品跑标准 01 背包#includeiostream using namespace std; // dp[j]金额不超过j时的最大价值 int dp[6001]; int main(){ int n,m; cinnm; for(int i1;in;i){ int v,w,s; cinvws; // 拆分成2的幂次打包 for(int k1;s0;k1){ // 不能超过剩下的数量 int cntmin(s,k); int costcnt*v,valuecnt*w; // 01背包倒序遍历容量 for(int jm;jcost;j--){ dp[j]max(dp[j],dp[j-cost]value); } s-cnt; } } coutdp[m]; return 0; }混合背包01 背包 完全背包 多重背包 三种类型混在一起有的物品只可以取一次有的物品可以取无限次有的物品可以取的次数有一个上限题目一个旅行者有一个最多能用V公斤的背包现在有n件物品它们的重量分别是W1W2...,Wn它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次有的物品可以取无限次有的物品可以取的次数有一个上限。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量且价值总和最大。思路对每个物品分情况处理p0→ 完全背包无限拿正序遍历容量p≥1→ 多重背包有限拿二进制优化 倒序遍历容量代码#includeiostream using namespace std; // dp[j]背包容量不超过j时的最大价值 int dp[201]; int main(){ int v,n,w,c,p; cinvn; for(int i1;in;i){ cinwcp; // 完全背包 if(p0){ for(int jw;jv;j){ dp[j]max(dp[j],dp[j-w]c); } } // 多重背包 else{ for(int k1;p0;k1){ int cntmin(p,k); int weightcnt*w,valuecnt*c; for(int jv;jweight;j--){ dp[j]max(dp[j],dp[j-weight]value); } p-cnt; } } } coutdp[v]; return 0; }分组背包给定n组物品第i组物品包含若干个物品每个物品的重量和价值不同每组最多只能选择一个物品题目金明的预算方案NC16671思路每个主件最多有2个附件那么可以将每个主件与其附件看作一个物品组每个物品组里有只有一个主件一个主件第一个附件一个主件第二个附件一个主件第一个附件第二个附件这四个物品每个物品组只能选一个物品。题目就是分组背包的形式了分组背包解法定义dp[j]表示在背包容量为 j 时的最大价值一维数组优化对于每组物品尝试选择该组中的每一个物品或不选择任何物品更新dp数组代码#include iostream #include vector using namespace std; pairint,inta[60]; //存储每组主件的v,w vectorpairint,int b[60]; //存储每组主件的附件v,w 二维数组 int dp[32010]; //存储前i件物品,总钱数为j时价格*重要度的最大值 int main(){ int n,m,i,v,w,p; cinnm; for(i1;im;i){ //遍历所有物品 cinvwp; wv*w; //更新重要度为价格*重要度 if(p0){ //是主件 a[i]{v,w}; }else{ b[p].push_back({v,w}); //加入所属主件的附件列表 } } for(i1;im;i){ //遍历所有物品 if(a[i].first0) continue; //没有主件 for(int jn;ja[i].first;j--){ //从大到小遍历总钱数 dp[j]max(dp[j],dp[j-a[i].first]a[i].second); //只有一个主件 if(b[i].size()1){ //只有一个附件 if(ja[i].firstb[i][0].first) //可以买主件附件 dp[j]max(dp[j],dp[j-a[i].first-b[i][0].first]a[i].secondb[i][0].second); } if(b[i].size()2){ if(ja[i].firstb[i][0].first) //可买主件第一件附件 dp[j]max(dp[j],dp[j-a[i].first-b[i][0].first]a[i].secondb[i][0].second); if(ja[i].firstb[i][1].first) dp[j]max(dp[j],dp[j-a[i].first-b[i][1].first]a[i].secondb[i][1].second); if(ja[i].firstb[i][0].firstb[i][1].first) dp[j]max(dp[j],dp[j-a[i].first-b[i][0].first-b[i][1].first]a[i].secondb[i][0].secondb[i][1].second); } } } coutdp[n]; return 0; }变形二维约束 01 背包问题题目有带2种气体的气缸一个为氧气一个为氮气。让潜水员下潜的深度需要各种的数量的氧和氮。潜水员有一定数量的气缸。每个气缸都有重量和气体容量。潜水员为了完成他的工作需要特定数量的氧和氮。求他完成工作所需气缸的总重的最低限度的是多少输入第一行有2整数m,n1m21,1n79表示氧氮各自需要的量。第二行为整数k1k1000表示气缸的个数。此后的k行每行包括aibici1ai211bi791ci8003整数。这些各自是第i个气缸里的氧和氮的容量及汽缸重量。思路每个气缸只能选或不选01 背包双重限制选用气缸总氧气 ≥ 需求氧、总氮气 ≥ 需求氮目标满足气量要求下所选气缸总重量最小定义dp[i][j]为凑出至少 i 升氧、至少 j 升氮的最小气缸总重量。遍历每个气缸倒序更新二维背包避免重复选取同一气缸。#includeiostream using namespace std; const int INF 0x3f3f3f3f; int main(){ int m,n,k,a,b,c; cinmnk; // 定义dp[i][j]至少i升氧、j升氮的最小气缸重量 int dp[22][80]; // 初始化为无穷大 没有气缸凑不出来 for(int i0;im;i){ for(int j0;jn;j){ dp[i][j]INF; } } dp[0][0]0; // 遍历每个气缸执行01背包状态转移 for(int i1;ik;i){ cinabc; for(int xm;x0;x--){ for(int yn;y0;y--){ // 能凑出来才用来更新最优重量 if(dp[x][y]!INF){ // 新的氧气封顶就够了 int omin(xa,m); // 新的氮气 int nimin(yb,n); dp[o][ni]min(dp[o][ni],dp[x][y]c); } } } } coutdp[m][n]; return 0; }

相关文章:

<背包问题>

背包问题是一类组合优化问题,其基本形式是给定一组物品,每个物品都有一个重量和一个价值,以及一个有限的背包容量,目标是在不超过背包容量的前提下,选择物品使得背包中的物品价值最大化。动态规划是解决背包问题的常用…...

基于雷达与光敏传感器的低功耗智能窗防设备设计与实现

1. 项目概述:一个基于雷达与光敏的智能窗防设备几年前,我因为一次短暂的出差,家里空置了几天,回来后就一直琢磨着怎么给家里的窗户加点“动静”。市面上的智能安防摄像头固然好,但要么需要复杂的布线,要么云…...

武汉国电华美16875kVA串联谐振试验装置,这手活儿细

在超高压变电站和长距离电缆的现场,交流耐压试验是检验设备绝缘的“最后一关”。这位老师傅经手过不少大工程,他说,面对GIS、大型变压器这些“大块头”电容性试品,能不能顺利“过关”,往往就看串联谐振装置顶不顶得住。…...

武汉国电华美串联谐振试验装置,现场用着心里有底

在高压试验现场干了这么多年,这位老师傅常说,一台好的串联谐振装置,就是试验人员的胆。面对GIS、大型变压器、超高压电缆这些大电容试品,没有趁手的谐振设备,交流耐压试验根本没法干。16875kVA/225kV这个规格&#xff…...

OmenSuperHub:释放惠普游戏本性能的纯净开源控制中心

OmenSuperHub:释放惠普游戏本性能的纯净开源控制中心 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为官方…...

收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备

如今人工智能早已脱离概念炒作阶段,全面扎根企业实际业务场景,成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道,行业心态也从初期观望试探,彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...

浏览器指纹识别机制深度剖析与反识别技术实现

一、浏览器指纹技术基础认知1.1 浏览器指纹的核心定义在数字化时代,每一台接入互联网的设备都会留下独特的数字标识,浏览器指纹便是其中最关键的识别凭证之一。浏览器指纹是网站通过 JavaScript 脚本、HTTP 请求头、硬件接口调用等多种技术手段&#xff…...

Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参

Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参 【免费下载链接】gz-sim Open source robotics simulator. The latest version of Gazebo. 项目地址: https://gitcode.com/gh_mirrors/gz/gz-sim Gazebo Sim是一款功能强大的开源机器人模拟器&#xff…...

sngan_projection论文解读:ICLR2018两大GAN技术的完美结合

sngan_projection论文解读:ICLR2018两大GAN技术的完美结合 【免费下载链接】sngan_projection GANs with spectral normalization and projection discriminator 项目地址: https://gitcode.com/gh_mirrors/sn/sngan_projection sngan_projection是一个实现了…...

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型 【免费下载链接】DeepPurpose A Deep Learning Toolkit for DTI, Drug Property, PPI, DDI, Protein Function Prediction (Bioinformatics) 项目地址: https://gitcode.com/gh_mirrors/de…...

终极Node.js Mock工具:Mockery入门到精通实战教程

终极Node.js Mock工具:Mockery入门到精通实战教程 【免费下载链接】mockery Simplifying the use of mocks with Node.js 项目地址: https://gitcode.com/gh_mirrors/mock/mockery Mockery是Node.js生态中简化Mock使用的终极工具,它为开发者提供了…...

Hindsight API参考:REST接口完整文档

Hindsight API参考:REST接口完整文档 【免费下载链接】hindsight Hindsight: Agent Memory That Learns 项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight Hindsight是一个强大的Agent Memory系统,提供了全面的REST API接口&…...

CUDA并行计算与FSR框架优化实践

1. CUDA并行计算与FSR框架概述在GPU加速计算领域,CUDA(Compute Unified Device Architecture)作为NVIDIA推出的并行计算平台和编程模型,已经成为高性能计算的事实标准。其核心设计理念是将计算任务分解为网格(Grid&…...

Claude SWOT分析(内部风控文档流出版):3类高危使用场景+2个监管红线预警

更多请点击: https://intelliparadigm.com 第一章:Claude SWOT分析(内部风控文档流出版):3类高危使用场景2个监管红线预警 高危使用场景识别 在企业级AI应用中,Claude模型若未经严格风控适配,…...

如何快速掌握Avidemux:新手完整入门指南与5个核心技巧

如何快速掌握Avidemux:新手完整入门指南与5个核心技巧 【免费下载链接】avidemux2 Avidemux2, simple video editor 项目地址: https://gitcode.com/gh_mirrors/avi/avidemux2 Avidemux是一款功能强大且完全开源的专业视频编辑工具,专为快速剪辑、…...

WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案

WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案 【免费下载链接】wtfautolayout The source code for Why The Failure, Auto Layout? 项目地址: https://gitcode.com/gh_mirrors/wt/wtfautolayout 在iOS开发中,Auto Layout是构建灵…...

Atomic Layout核心概念解析:Composition组件如何实现布局与间距分离的终极指南

Atomic Layout核心概念解析:Composition组件如何实现布局与间距分离的终极指南 【免费下载链接】atomic-layout Build declarative, responsive layouts in React using CSS Grid. 项目地址: https://gitcode.com/gh_mirrors/at/atomic-layout Atomic Layout…...

基于USB ACA模式实现安卓手机边玩边充的游戏手柄设计

1. 项目缘起:当手机性能过剩,却败给了触摸屏几年前,我清理手机游戏时,发现一个挺无奈的现象:性能足以媲美掌机的智能手机里,只剩下一些慢节奏的平台解谜或者数独。那些曾经让我在掌机上废寝忘食的赛车、动作…...

3分钟解锁网易云音乐NCM文件:ncmdumpGUI小白也能懂的完整教程

3分钟解锁网易云音乐NCM文件:ncmdumpGUI小白也能懂的完整教程 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的歌曲&a…...

Qri高级功能:如何使用JSON Schema验证和描述数据集结构

Qri高级功能:如何使用JSON Schema验证和描述数据集结构 【免费下载链接】qri youre invited to a data party! 项目地址: https://gitcode.com/gh_mirrors/qr/qri Qri是一个强大的开源数据协作工具,它提供了丰富的功能来帮助用户管理、共享和验证…...

Raspberry Pi Debug Probe:RP2040嵌入式开发的调试利器与实战指南

1. 项目概述:为什么你需要一个Raspberry Pi Debug Probe?如果你玩过树莓派Pico或者任何基于RP2040芯片的开发板,肯定遇到过这样的场景:写好的代码,点一下“上传”,然后……就没有然后了。板子上的LED没按你…...

基于Netburner NANO54415构建工业级嵌入式Web服务器:从硬件选型到广域监控实战

1. 项目概述:一个为广域与本地监控而生的嵌入式Web服务器如果你正在寻找一个能部署在野外、工厂角落或者任何需要远程数据采集与控制场景下的嵌入式Web服务器方案,并且对市面上那些要么性能孱弱、要么开发门槛极高的开发板感到厌倦,那么这个基…...

Jupyter Notebook里跑argparse脚本总报错?一个空列表参数搞定ipykernel_launcher.py error

Jupyter Notebook中argparse报错的终极解决方案:空列表参数实战解析在数据科学和机器学习的工作流中,Jupyter Notebook因其交互式特性成为众多研究者的首选工具。然而,当我们尝试在Notebook中运行那些原本为命令行设计的Python脚本时&#xf…...

开源ELM327 OBD-II适配器:从硬件设计到多协议固件实现全解析

1. 项目概述:开源ELM327 OBD适配器如果你对汽车诊断、数据监控或者嵌入式开发感兴趣,那么自己动手做一个OBD-II适配器绝对是个能让你学到很多东西的硬核项目。今天要聊的,就是一个完全开源的、基于NXP LPC1517微控制器的ELM327兼容OBD适配器。…...

RevSSH反向SSH隧道:无公网IP设备的安全远程运维方案

1. 这不是又一个SSH封装工具——RevSSH解决的是“根本性连接悖论”你有没有遇到过这样的场景:一台部署在客户内网的嵌入式设备,没有公网IP,NAT穿透失败,防火墙策略死死锁住所有入向端口,连ICMP都被禁了;或者…...

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题当你在Linux服务器上部署Nacos时,是否遇到过启动失败却无从下手的困境?作为阿里巴巴开源的服务发现和配置管理平台,Nacos在微服务架构中扮演着重要角色。然而&am…...

手把手教你用Mind+和Blynk,让手机轻松遥控掌控板(含自建服务器避坑指南)

从零搭建物联网控制平台:Mind与Blynk深度整合实战 当你第一次尝试用手机控制硬件设备时,那种"隔空取物"的奇妙感总会让人兴奋不已。想象一下,躺在沙发上就能调节书桌上的智能台灯亮度,或者在外出时随时查看家中的温湿度…...

styled-theming 性能优化:如何避免主题切换时的性能瓶颈

styled-theming 性能优化:如何避免主题切换时的性能瓶颈 【免费下载链接】styled-theming Create themes for your app using styled-components 项目地址: https://gitcode.com/gh_mirrors/st/styled-theming styled-theming 是一个专为 styled-components …...

如何快速集成 react-native-bottom-sheet-behavior:5 分钟搞定 Android 底部弹窗

如何快速集成 react-native-bottom-sheet-behavior:5 分钟搞定 Android 底部弹窗 【免费下载链接】react-native-bottom-sheet-behavior react-native wrapper for android BottomSheetBehavior 项目地址: https://gitcode.com/gh_mirrors/re/react-native-bottom…...

defx.nvim 安装与配置完全教程:从零开始搭建高效文件管理系统 [特殊字符]

defx.nvim 安装与配置完全教程:从零开始搭建高效文件管理系统 🚀 【免费下载链接】defx.nvim :file_folder: The dark powered file explorer implementation for neovim/Vim8 项目地址: https://gitcode.com/gh_mirrors/de/defx.nvim defx.nvim …...