01背包
f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少
res=max(f[n][0~v])
f[i][j]:
1.不选第i个物品 f[i][j]=f[i-1][j]
2. 选第i个物品 f[i][j]=f[i-1][j-v[i]]
f[i][j]=max{1.2.}
f[0][0]=0
时间复杂度 nm
#include<iostream>
using namespace std;
const int N =1010;
int n,m;
int w[N],v[N];
int f[N][N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];
if(j>=v[i])
f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
//优化,直接去掉第一维,实际用的状态时f[i][j-v[i]],从小到大可以解决。
}
}
int res=0;
for(int i=0;i<=m;i++)
res=max(res,f[n][i]);
cout<<res<<endl;
return 0;
}
优化之后
#include<iostream>
using namespace std;
const int N =1010;
int n,m;
int w[N],v[N];
int f[N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=m;j>=v[i];j--)
f[j]=max(f[j],f[j-v[i]]+w[i]);
cout<<f[m]<<endl;
return 0;
}