前情请见:https://blog.csdn.net/m0_70400544/article/details/128818019?spm=1001.2014.3001.5502
问题提出
在上期讲解中我们用二维数组解决了01背包问题,但是空间复杂度较大,是否能优化成一维数组呢?
优化思路
在使用二维数组解决01背包问题时,求dp[i][...]时,只需要调用dp[i-1][...]。因此i这一项是完全不需要的,只需要通过滚动,用现在的替换之前的,但是要注意要倒过来循环,否则调用到的dp[j-wi]是已经被替换过的新数。
![](https://img-blog.csdnimg.cn/img_convert/696f2f62278bc9feaba2b3102da1b4ce.png)
正确代码
#include<bits/stdc++.h>
using namespace std;
int c,n,w,v,dp[20023];
/*
c : 背包容量
n : 物品数量
w : 当前物品的重量
v : 当前物品的价值
dp[背包容量]
*/
void solve(){
cin>>c>>n;
//遍历每个物品
for(int i=1;i<=n;i++){
cin>>w>>v;
//倒过来循环!!!
for(int j=c;j>=w;j--){
dp[j]=max(dp[j],dp[j-w]+v);
}
}
//输出答案
cout<<dp[c];
}
int main(){
//加速输入输出
cin.tie(0);
ios::sync_with_stdio(0);
int tc=1; //cin>>tc;
while(tc--) solve();
return 0;
}
01背包问题 一维数组空间优化 详细讲解