填坑行动3-背包DP

01背包

01背包可以说是比较经典的一个算法了,它是动态规划的精髓。01背包问题一般是一个这样的问题:

N种物品,每种物品的体积分别为wi,价值分别为Ci每种物品只能拿一次。 有一个体积为M的背包。请问背包能带走最大的价值是多少?

一般人会想到用贪心来做,但是,贪心往往是错误的。看一下一组数据:
N=3
M=5
W={4,3,2}
C={7,5,3}
显然答案是8,但是用贪心的话答案就是7,所以贪心是错误的。
那么该怎么做呢?O(2n)肯定会T飞,那么该肿么办呢?

算法解析

fi,j为当背包体积为j的时候,有i件物品时所带走最大的价值。显然有两种做法:不取、取。
如果不取,那么值就是fi1,j
如果取,那么就要在背包内挖出一块wi的空间来存储,还要加上ci。值就是fi1,jwi+ci。当然还有满足wij
综上得fi,j=max(fi1,j,fi1,jwi+ci)

复杂度分析

给出一个代码

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];

显然我们可以发现空间复杂度为O(MN)。时间复杂度也是O(MN)

空间优化

有些时候当MN比较大的时候,我们需要进行空间优化。
我们发现,要得到fi这一行,只需要得到fi1就可以了,我们就可以开一个数组int f[2][maxn]就够了。
当然,我们可以直接开一个一维数组,只不过需要从后往前更新,至于原因....我懒得说

posted @   jiangtaizhe001  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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工具
点击右上角即可分享
微信分享提示