背包问题
背包问题写过很多,今天又遇到了结果忘记怎么搞了,其实一系列相关的动规也不太会,不过背包还算是有模板。稍微记录一下。
01背包问题:有N件物品和一个容量为V的背包。第i件物品的费用是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大。
1 /* 2 背包内的价值可以设置一个二维数组ans[i][j] 3 表示前i件物品恰放入一个容量为j的背包可以获得的最大价值 4 不放入-> ans[i-1][j] 5 放入-> ans[i-1][j-对应物品的重量]+对应物品的价值 6 */ 7 for(int i=1;i<=n;i++)//背包的每个物体都走一遍流程 8 for(int c=m;c>=0;c--)//c模拟背包的容量m 遍历每一个背包容量情况 9 if(c>=w[i])//如果装得下当前的i物品 10 f[c]=max(f[c],f[c-w[i]]+v[i]);//则加上价值i对比并更新最优决策
完全背包问题:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
01背包的变种其一,唯一的区别就是每个物品都是无限可用了。对于每件的物品决策除了取1件或者不取,可以衍生出取2件,取3件...但是状态转移方程是一样的
但是01背包是倒序的,完全背包则是正序的。考虑正序的本质实际上是在考虑“加选某个物品”,比较的是之前的子结果的情况下加选的新结果。
for(int i=1;i<=n;i++) for(int c=0;c<=m;c++)//背包的容量变成了正序,其余的没有变化 if(c>=w[i]) f[c]=max(f[c],f[c-w[i]]+v[i]);
多重背包问题:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
01背包的变种其二,把物品复制成N份,还是原来的01背包。在选取物品的决策上加个取多少的系数。
for(int i=1;i<=n;i++) for(int c=m;c>=0;c--) for(int k=1;k<=n[i]&&j-k*w[i]>=0;k++)//多设置一个取件系数k f[c]=max(f[c],f[c-w[i]*k]+v[i]*k);
混合背包问题:将0-1背包、完全背包、多重背包混合起来。有的物品只可以取一次,有的物品可以取无限次,有的物品可以取的次数有一个上限。缝合怪背包问题
总感觉这种背包问题是在整活一样,实际上的解法是把之前的解法结合起来,事先区分具体是哪种背包,然后再丢一起
for(int i=1;i<=n;i++) { if(是01背包) { for(int j=V;j>=w[i];j--) f[j]=max(f[j],f[j-w[i]]+v[i]); } else if(是完全背包) { for(int j=w[i];j<=V;j++) f[j]=max(f[j],f[j-w[i]]+v[i]); } else是多重背包 { for(int j=V;j>=w[i];j--) for(int k=1;k<=p[i]&&j-k*w[i]>=0;k++) f[j]=max(f[j],f[j-w[i]*k]+v[i]*k); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具