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

背包九讲(C++)

目录背包问题1.0/1背包2.完全背包3.多重背包4.分组背包5.混合背包问题6.背包问题求具体方案7.背包问题求方案数8.二维费用的背包问题9.有依赖的背包问题背包问题任何背包问题都有01背包的影子甚至均可以化为01背包的问题(特殊性)而任何背包都是多重背包的特殊情况01背包和完全背包分别是多重背包分组个数的极端情况即多重背包具有普遍性可以说只要理解了多重背包其它的背包问题也就跟着解决了我也会通过代码注释的形式帮助读者理解这句话1.0/1背包​//朴素版代码 // #include iostream // using namespace std; // const int N1e39; // int dp[105][N]; // int n,m; // int main() // { // cinnm; // dp[0][0]0; // for(int i1;in;i) // { // int w,v;cinwv; // for(int j0;jm;j) // { // //不选 // dp[i][j]dp[i-1][j]; // //选 // if(jw) // dp[i][j]max(dp[i][j],dp[i-1][j-w]v); // } // } // coutdp[n][m]; // return 0; // } //优化代码 #include iostream using namespace std; const int N1e39; int dp[N]; int n,m; int main() { cinnm; for(int i1;in;i) { int w,v;cinwv; for(int jm;jw;j--) dp[j]max(dp[j],dp[j-w]v);////不选时dp[i][j]dp[i-1][j] } coutdp[m]; return 0; }2.完全背包当空间优化成一维之后只有完全背包问题的体积是从小到大循环的​//朴素版代码 // #include iostream // using namespace std; // const int N1e310; // int dp[N][N]; // int main() // { // int n,m;cinnm; // for(int i1;in;i) // { // int w,v;cinwv; // for(int j0;jm;j) // { // //第i类物品不选 // dp[i][j]dp[i-1][j]; // //第i类物品选 // for(int k1;k*wj;k) // { // dp[i][j]max(dp[i][j],dp[i-1][j-k*w]k*v);//第i类物品可以选多次取最大的一次 // } // } // } // coutdp[n][m]\n; // return 0; // } //优化代码: //因为dp[i][j]max(dp[i-1][j],dp[i-1][j-w]v,dp[i-1][j-2*w]2*v……dp[i-1][j-k*w]k*v……) // dp[i][j-w]vmax(dp[i-1][j-w]v,dp[i-1][j-2*w]2*v,……dp[i-1][j-k*w]k*v……) //所以: dp[i][j]max(dp[i-1][j],dp[i][j-w]v) //也说明了j需要从小到大循环这是与0/1背包最大的不同j需要当前第i层循环的j-w来更新 #includeiostream using namespace std; const int N1e39; int dp[N]; int main() { int n,m;cinnm; for(int i1;in;i) { int w,v;cinwv; for(int jw;jm;j) { dp[j]max(dp[j],dp[j-w]v);//不选时dp[i][j]dp[i-1][j] } } coutdp[m]; }3.多重背包根据数据规模选择合适的优化方法10^2/s : 化为01背包10^3/s : 二进制优化将一个一个遍历变为一群一群遍历10^4/s : 单调队列优化求滑动窗口内的最大值​//朴素版代码 // #include iostream // using namespace std; // const int N103,M203; // int f[N][M]; // int n,m; // int main() // { // cinnm; // for(int i1;in;i) // { // int v,w,s;cinvws; // for(int j0;jm;j) // { // f[i][j]f[i-1][j]; // for(int k1;ks;k) // { // if(jk*v) // f[i][j]max(f[i][j],f[i-1][j-k*v]k*w); // } // } // } // coutf[n][m]\n; // return 0; // } //优化版本 //思路一:化为01背包 //时间复杂度O(n*m*s) #include iostream using namespace std; const int N103,M203; int f[M]; int n,m; int main() { cinnm; for(int i1;in;i) { int v,w,s;cinvws; ////多重背包化为01背包把每种物品的s件一一摊开视为s个相同属性的物品即化为01背包 while(s--)////对每个物品循环s[i]次其余同01背包 for(int jm;jv;j--) { f[j]max(f[j],f[j-v]w); } } coutf[m]\n; return 0; } //思路二二进制优化 //时间复杂度O(n*m*log s) #includeiostream using namespace std; const int N2005; int f[N]; int n,m; int vv[20],ww[20]; int main() { cinnm; for(int i1;in;i) { int s,v,w;cinvws; int cnt0; for(int k1;ks;k1) {//有二进制优化的方法将原来思考一的一个一个地枚举变为一群一群地枚举 vv[cnt]v*k; ww[cnt]w*k; s-k; } if(s) { vv[cnt]v*s;//将这一群的物品看成一个物品 ww[cnt]w*s; } for(int k1;kcnt;k) { for(int jm;jvv[k];j--) f[j]max(f[j],f[j-vv[k]]ww[k]); } } coutf[m]\n; return 0; } //思路三滑动窗口单调队列 //时间复杂度O(n*m) #include iostream #includecstring using namespace std; const int N103,M203; int f[M],g[M],q[M]; int n,m; int main() { cinnm; for(int i1;in;i) { int v,w,s;cinvws; memcpy(g,f,sizeof f);//存一下上一层的元素 for(int j0;jv;j) { int hh1,tt0; for(int kj;km;kv) { if(hhtt(k-q[hh])/vs) hh;//如果窗口大于s个单位,则窗口前移 while(hhttg[q[tt]]-(q[tt]-j)/v*wg[k]-(k-j)/v*w) tt--;//运用单调队列优化求滑动窗口中的最值 q[tt]k;//入队队列存贮的是体积大小hh、tt只是q数组下标用于模拟队列和控制滑动窗口 if(hhtt) f[k]max(f[k],g[q[hh]](k-q[hh])/v*w);//窗口内的最大值进行状态转移 } } } coutf[m]\n; return 0; }4.分组背包分组背包组内的每一种选择均互斥这是与多重背包的本质区别​#includeiostream using namespace std; const int N110; int f[N],v[N],w[N]; int n,m,s; int main() { cinnm; for(int i1;in;i) { cins; for(int j1;js;j) cinv[j]w[j]; for(int jm;j0;j--) for(int k1;ks;k) if(jv[k]) f[j]max(f[j],f[j-v[k]]w[k]);//对于同i组的物品分别考虑每一物品的选与不选这里与01背包很像 } coutf[m]\n; }5.混合背包问题这题能非常清晰地看出01背包、完全背包、多重背包的关联。​#includeiostream using namespace std; const int M1005; int f[M]; int vv[M],ww[M]; int n,m; int main() { cinnm; for(int i1;in;i) { int v,w,s;cinvws; if(s0) { for(int jv;jm;j)//完全背包 f[j]max(f[j],f[j-v]w); } else { if(s-1) s1;//01背包是多重背包s1时的特殊情况 int cnt0; for(int k1;ks;k1)//二进制优化的多重背包 { vv[cnt]v*k; ww[cnt]w*k; s-k; } if(s) { vv[cnt]v*s; ww[cnt]w*s; } for(int k1;kcnt;k) { for(int jm;jvv[k];j--) f[j]max(f[j],f[j-vv[k]]ww[k]); } } } coutf[m]\n; return 0; }6.背包问题求具体方案​#includeiostream using namespace std; const int N1005; int f[N][N]; int n,m; int v[N],w[N]; int main() { cinnm; for(int i1;in;i) cinv[i]w[i]; for(int in;i1;i--)//f[i][j]表示从i到n的选择情况 { for(int j0;jm;j) { f[i][j]f[i1][j]; if(jv[i]) f[i][j]max(f[i][j],f[i1][j-v[i]]w[i]); } } int jm; for(int i1;in;i)//因为最后一件物品存储的是最终状态所以从最后一件物品进行循环 {//我们不能正着寻找答案因为从0到1我们对于最优解中的第一件物品不知道选的是第几个物品从而无法确定他的初始体积多少但反着来我们一定会知道它的最后体积必为m if(jv[i]f[i][j]f[i1][j-v[i]]w[i]) { couti ; j-v[i]; } } return 0; }7.背包问题求方案数​//思路一体积恰好为i #includeiostream #includecstring using namespace std; const int N1005,mod1e97; int f[N],g[N];//f[i]表示体积恰好为i的最优解g[i]表示最优解的方案数 int n,m; int main() { cinnm; memset(f,-0x3f,sizeof f); //从这个状态表示我们就该想到它与普通01背包的区别了我们需要在开始将所有的f都初始化为负无穷 //那么不能使体积恰好为j的情况就会被淘汰指不会被递推过去 g[0]1; f[0]0; for(int i1;in;i) { int v,w;cinvw; for(int jm;jv;j--) { int maxvmax(f[j],f[j-v]w); int cnt0; if(maxvf[j]) cntg[j]; if(maxvf[j-v]w) cntg[j-v]; g[j]cnt%mod; f[j]maxv; } } int res0; for(int i0;im;i) resmax(res,f[i]); int ans0; for(int i0;im;i) { if(resf[i]) ans(ansg[i])%mod; } coutans\n; return 0; } //思路二体积不超过i #includeiostream using namespace std; const int N1005; const int mod1e97; int f[N],g[N];////f[i]表示体积不超过i的最优解g[i]表示最优解的方案数 int n,m; int main() { cinnm; for(int i0;im;i) g[i]1;//不论是哪个体积下总有一个对应的最大价值方案数为1 for(int i1;in;i) { int v,w;cinvw; for(int jm;jv;j--) { if(f[j-v]wf[j]) { f[j]f[j-v]w; g[j]g[j-v];//一条路 } else if(f[j-v]wf[j]) g[j](g[j]g[j-v])%mod;//两条路 } } coutg[m]\n;//体积不超过m的最大价值方案数 return 0; }8.二维费用的背包问题理解二维费用的背包问题代码中的多重循环能更好地理解背包问题中循环递推的过程。​//f[i,j]表示总体积和总重量分别不超过i,j的最优解这与单个物品的体积和重量毫不相关就不是同一个概念 //因此多重循环并没有割裂单个物品的体积和重量 #includeiostream using namespace std; const int N105; int f[N][N]; int n,V,M; int main() { cinnVM; for(int i1;in;i) { int v,m,w;cinvmw; for(int jV;jv;j--) { for(int kM;km;k--) { f[j][k]max(f[j][k],f[j-v][k-m]w); } } } coutf[V][M]\n; return 0; }9.有依赖的背包问题​#includeiostream #includecstring //树形DP分组背包 using namespace std; const int N105; int e[N],ne[N],h[N],idx; int v[N],w[N]; int n,m; int f[N][N]; //a是b的父节点 void add(int a,int b) {//用数组模拟邻接表用于存储图效率比STL中的容器高 e[idx]b,ne[idx]h[a],h[a]idx; //idx:数组模拟的下标(指针)即表示该元素在数组中的位置每存储一个元素就用偏移一次 //e[idx]:数组模拟的实际值用于存储结点号 //ne[idx]:e[idx]的下一个结点 //h[]:表示头结点初始时头结点指向-1也就是相当与多个链表的头结点放在了一个数组中 }//这个操作相当于在链表的头结点和头结点指向的元素之间插入一个结点插入结点的顺序对图没有影响 void dfs(int u) { for(int ih[u];~i;ine[i])//循环物品组 { int sone[i]; dfs(son); //分组背包 for(int jm-v[u];j0;j--)//循环物品 { for(int k0;kj;k)//循环决策按体积进行决策 f[u][j]max(f[u][j],f[u][j-k]f[son][k]); } } //将u加进去 for(int im;iv[u];i--) f[u][i]f[u][i-v[u]]w[u]; for(int i0;iv[u];i) f[u][i]0;//体积不够那以u为根的树的体积为0 } int main() { cinnm; memset(h,-1,sizeof h);//头结点的初始化指向-1表示无儿子 int root1; for(int i1;in;i) { int p; cinv[i]w[i]p; if(p-1) rooti; else add(p,i); } dfs(root); coutf[root][m]\n; return 0; }

相关文章:

背包九讲(C++)

目录 背包问题 1.0/1背包 2.完全背包 3.多重背包 4.分组背包 5.混合背包问题 6.背包问题求具体方案 7.背包问题求方案数 8.二维费用的背包问题 9.有依赖的背包问题 背包问题 任何背包问题都有01背包的影子,甚至均可以化为01背包的问题(特殊性)&#xff0…...

2026年电力电缆品牌梳理多维度适配项目选型需求

随着双碳目标落地与电力基础设施完善,电力电缆作为电力传输的重要载体,市场需求持续释放,产品向高安全、长寿命、广适配方向发展。本文基于市场应用与企业实力,整理电力电缆品牌信息,助力项目合理选型。一、2026年电力…...

如何学习java?

目录 一. 初识Java 1. Java语⾔概述 1.1 Java是什么 1.2 什么是JavaSE?什么是JavaEE? JavaSE(JavaStandardEdition): JavaEE(JavaEnterprise Edition): 主要区别: 1.3 Java语⾔重要性 1.4 Java语⾔发展简史 1.5 Java语⾔特性 1.6 Java开发环境安装 1. …...

英雄联盟Akari助手:你的智能游戏伴侣完整指南,轻松提升游戏体验 [特殊字符]

英雄联盟Akari助手:你的智能游戏伴侣完整指南,轻松提升游戏体验 🚀 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolk…...

新加坡高校 Canvas 攻击事件影响评估与安全治理研究

摘要 2026 年 5 月发生的 Canvas 学习平台全球供应链攻击事件,对新加坡国立大学、新加坡社科大学、新加坡管理学院等高校造成服务中断与数据泄露风险,成为教育数字化场景下第三方平台安全风险的典型案例。本次攻击由 Shiny Hunters 组织实施,…...

基于ARP欺骗的中间人攻击的Python实现

摘要:本文在模拟网络攻击实验环境中,使用Python的scapy模块构造ARP数据包发送给目标机进行ARP欺骗,成功实施了中间人攻击,然后嗅探局域网内部网络流量,截取HTTP协议数据包进行解析,初步实现了在被攻击者浏览…...

Python face_recognition 库实战:从环境搭建到人脸特征点检测

1. 环境准备:搭建人脸识别的开发环境 第一次接触人脸识别开发时,最让人头疼的就是环境配置。记得我刚开始用face_recognition库时,光是安装依赖就折腾了大半天。后来才发现,其实只要掌握几个关键步骤,整个过程可以非常…...

审核员能力模型——冰山模型说人话版

📋 审核概论系列 第9篇/共10篇知识和技能不等于能力。认证审核员到底需要什么能力?麦克利兰冰山模型告诉你📊 真实场景:CCAA注册审核员考试通过率大约只有30%-40%。很多人专业知识学了不少,ISO 9001标准背得滚瓜烂熟&…...

Ajax技术和Axois工具库

前端如何才能动态展示数据?如何动态获取后端的数据呢? 目录 文章目录 一、什么是Ajax? 二、什么是Axios? 核心用途 三、如何在Vue项目中使用Axios? 1、安装Axios 2、引入Axios 3、基础使用 4、拦截器 5、async/await是什么? 总…...

Zotero Duplicates Merger终极指南:3分钟彻底告别文献库重复烦恼

Zotero Duplicates Merger终极指南:3分钟彻底告别文献库重复烦恼 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 还在为Zotero文献…...

清华PPT模板终极指南:告别PPT设计烦恼,轻松制作专业演示

清华PPT模板终极指南:告别PPT设计烦恼,轻松制作专业演示 【免费下载链接】THU-PPT-Theme 清华主题PPT模板 项目地址: https://gitcode.com/gh_mirrors/th/THU-PPT-Theme 还在为学术答辩、项目汇报的PPT设计而头疼吗?每次打开PowerPoin…...

League Akari:3步打造你的英雄联盟智能游戏助手,告别繁琐操作

League Akari:3步打造你的英雄联盟智能游戏助手,告别繁琐操作 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League A…...

基于SSM框架的童装购买平台微信小程序(30286)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

从图文对到通用视觉:CLIP如何用对比学习重塑多模态预训练范式

1. 从图文匹配到通用视觉:CLIP的颠覆性思路 第一次看到CLIP模型时,我正为一个老问题头疼:训练好的图像分类器遇到新类别就直接"罢工"。比如用猫狗数据集训练的模型,突然给它看一只考拉,结果只会输出"猫…...

青岛银行员工才艺大赛|iPad评委打分系统案例

在青岛银行首届员工才艺大赛现场,熹乐互动的iPad评委打分系统为这场精彩赛事注入了高效、透明的科技体验。评委们只需通过iPad端操作,即可快速为节目打分,系统实时同步数据至大屏,自动完成分数统计、加权计算与排名更新。无需人工…...

Zutilo:为Zotero研究者量身打造的高效文献管理增强插件

Zutilo:为Zotero研究者量身打造的高效文献管理增强插件 【免费下载链接】Zutilo Zotero plugin providing some additional editing features 项目地址: https://gitcode.com/gh_mirrors/zu/Zutilo 作为一名Zotero用户,你是否曾为批量管理标签而烦…...

从仿真到调试:FSDB与VPD波形文件的生成与高效查看指南

1. 数字IC验证中的波形文件:为什么它们如此重要? 在数字IC验证的世界里,波形文件就像是工程师的"显微镜"。想象一下,你正在调试一个复杂的RTL设计,代码运行了,但结果不对。这时候,如果…...

2026十大建议考的经济学专业证书有哪些

2026年十大经济学专业证书推荐经济学专业证书能够提升职业竞争力,尤其在数据分析、金融和经济预测领域。以下是2026年值得考取的十大经济学专业证书,包括CDA数据分析师证书等热门选择。1. CDA数据分析师证书CDA数据分析师证书是数据分析领域的权威认证&a…...

带fp8激活量化的RMSNorm算子手撕

rms_norm_fp8_noweight_fp16:计算流程与优化 完整代码 void rms_norm_fp8_noweight_fp16(const __half *x, __nv_fp8_e4m3 *out,int seq_len, int dim, const float *d_scale,cudaStream_t stream) {rms_norm_fp8_noweight_kernel<<<seq_len, 256, 0, stream>&g…...

我的第一个CNN项目翻车实录:从过拟合到数据清洗,TensorFlow 2.1猫狗分类避坑指南

我的第一个CNN项目翻车实录&#xff1a;从过拟合到数据清洗&#xff0c;TensorFlow 2.1猫狗分类避坑指南 第一次接触深度学习时&#xff0c;我天真地以为只要按照教程搭建一个卷积神经网络(CNN)&#xff0c;就能轻松实现猫狗图片分类。然而现实给了我一记响亮的耳光——模型要么…...

ExplorerPatcher架构解析:深度剖析Windows界面定制引擎

ExplorerPatcher架构解析&#xff1a;深度剖析Windows界面定制引擎 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher ExplorerPatcher作为Window…...

【机器学习】集成学习(Boosting)——XGBoost算法(原理+推导+实战)

1. XGBoost为什么能成为竞赛冠军的标配&#xff1f; 第一次参加Kaggle比赛时&#xff0c;我完全被排行榜惊呆了——前50名的解决方案清一色都在用XGBoost。当时很不理解&#xff1a;明明有更"高级"的神经网络&#xff0c;为什么大家偏爱这个看似传统的算法&#xff1…...

八大网盘直链获取开源工具全面指南:如何高效管理你的云端文件下载

八大网盘直链获取开源工具全面指南&#xff1a;如何高效管理你的云端文件下载 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动…...

从零上手泰凌微TLSR8269:SIG Mesh SDK文件架构与编译环境搭建保姆级指南

泰凌微TLSR8269 SIG Mesh开发实战&#xff1a;从SDK解析到环境搭建全攻略 第一次打开泰凌微TLSR8269的SIG Mesh SDK时&#xff0c;面对密密麻麻的文件夹和文件&#xff0c;不少开发者都会感到无从下手。proj、proj_lib、vendor这些目录到底存放着什么&#xff1f;如何快速搭建起…...

终极风扇控制指南:如何用开源工具FanControl精准调节你的电脑散热系统

终极风扇控制指南&#xff1a;如何用开源工具FanControl精准调节你的电脑散热系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/Git…...

手把手教你用CH342 USB转串口模块在Ubuntu 22.04上调试(附dmesg日志分析)

手把手教你用CH342 USB转串口模块在Ubuntu 22.04上调试&#xff08;附dmesg日志分析&#xff09; 嵌入式开发中&#xff0c;串口调试是最基础却最容易出问题的环节。当你在Ubuntu 22.04上插入CH342模块准备调试ESP32开发板时&#xff0c;是否遇到过设备无法识别、权限拒绝或者波…...

2026年简易操作安装Hermes Agent/OpenClaw Token Plan全流程解析大全

2026年简易操作安装Hermes Agent/OpenClaw Token Plan全流程解析大全。OpenClaw作为阿里云生态下新一代的开源AI自动化代理平台&#xff0c;曾用名Moltbot/Clawdbot&#xff0c;凭借“自然语言交互自动化任务执行大模型智能决策”的核心能力&#xff0c;正在重构个人与企业的工…...

Fooocus:5分钟快速上手的AI图像生成完整指南,免费离线使用

Fooocus&#xff1a;5分钟快速上手的AI图像生成完整指南&#xff0c;免费离线使用 【免费下载链接】Fooocus Focus on prompting and generating 项目地址: https://gitcode.com/GitHub_Trending/fo/Fooocus 在AI图像生成技术快速发展的今天&#xff0c;Fooocus作为一款…...

2026年小白适用Hermes Agent/OpenClaw Token Plan集成全攻略大全

2026年小白适用Hermes Agent/OpenClaw Token Plan集成全攻略大全。OpenClaw作为阿里云生态下新一代的开源AI自动化代理平台&#xff0c;曾用名Moltbot/Clawdbot&#xff0c;凭借“自然语言交互自动化任务执行大模型智能决策”的核心能力&#xff0c;正在重构个人与企业的工作效…...

AI大模型选型生死线(2026企业采购决策白皮书):API延迟、幻觉率、合规审计通过率三维淘汰制解析

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI大模型选型生死线&#xff1a;2026企业采购决策范式重构 当算力成本下降47%、推理延迟压缩至83ms、私有化微调周期缩短至4.2小时&#xff0c;企业不再比拼“谁用了大模型”&#xff0c;而是在验证“谁…...