填坑行动3-背包DP
01背包
01背包可以说是比较经典的一个算法了,它是动态规划的精髓。01背包问题一般是一个这样的问题:
有种物品,每种物品的体积分别为,价值分别为。每种物品只能拿一次。 有一个体积为的背包。请问背包能带走最大的价值是多少?
一般人会想到用贪心来做,但是,贪心往往是错误的。看一下一组数据:
显然答案是,但是用贪心的话答案就是,所以贪心是错误的。
那么该怎么做呢?肯定会T飞,那么该肿么办呢?
算法解析
令为当背包体积为的时候,有件物品时所带走最大的价值。显然有两种做法:不取、取。
如果不取,那么值就是。
如果取,那么就要在背包内挖出一块的空间来存储,还要加上。值就是。当然还有满足
综上得
复杂度分析
给出一个代码
int f[maxn][maxn]; //读入已省略 for(i=1;i<=m;i++) f[1][i]=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(j>=w[i]) f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i]); else f[i][j]=f[i-1][j];
显然我们可以发现空间复杂度为。时间复杂度也是。
空间优化
有些时候当比较大的时候,我们需要进行空间优化。
我们发现,要得到这一行,只需要得到就可以了,我们就可以开一个数组int f[2][maxn]
就够了。
当然,我们可以直接开一个一维数组,只不过需要从后往前更新,至于原因....我懒得说
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具