各种背包模板
背包问题主要是背模板,这里收录了一些模板
一些复杂的背包问题(如泛化物品)未收录
01背包问题:
无优化
1 for(int i=1;i<=n;i++) 2 { 3 for(int c=0;c<=m;c++) 4 { 5 f[i][c]=f[i-1][c]; 6 if(c>=w[i]) 7 f[i][c]=max(f[i][c],f[i-1][c-w[i]]+v[i]); 8 } 9 }
一维数组优化:
1 for(int i=1;i<=n;i++) 2 { 3 for(int c=m;c>=0;c--) 4 { 5 if(c>=w[i]) 6 f[c]=max(f[c],f[c-w[i]]+v[i]); 7 } 8 }
更进一步的常数优化:
1 for(int i=1;i<=n;i++) 2 { 3 sumw+=w[i]; 4 bound=max(m-sumw,w[i]); 5 for(int c=m;c>=bound;c--) 6 { 7 if(c>=w[i]) 8 f[c]=max(f[c],f[c-w[i]]+v[i]); 9 } 10 }
完全背包问题:
1 for(int i=1;i<=n;i++) 2 { 3 for(int c=0;c<=m;c++) 4 { 5 if(c>=w[i]) 6 f[c]=max(f[c],f[c-w[i]]+v[i]); 7 } 8 }
多重背包问题:
for(int i=1;i<=n;i++) { if(w[i]*a[i]>m) { for(int c=0;c<=m;c++) { if(c>=w[i]) f[c]=max(f[c],f[c-w[i]]+v[i]); } } else { k=1;amount=a[i]; while(k<amount) { for(int c=k*w[i];c>=0;c--) { if(c>=w[i]) f[c]=max(f[c],f[c-w[i]]+k*v[i]); } amount-=k; k<<=1; } for(int c=amount*w[i];c>=0;c--) { f[c]=max(f[c],f[c-w[i]]+amount*v[i]); } } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库