AcWing 8. 二维费用的背包问题
原题链接
中等
作者:
hai阿卢
,
2021-02-16 15:40:42
,
所有人可见
,
阅读 346
状态表示
f[i][j][k]表示在前i个物品,可承受重量为j,体积为k时的最大价值;
w[i]表示第i个物品的价值
v[i]表示第i个物品的体积
m[i]表示第i个物品的重量
状态转移方程
f[i][j][k]=max(f[i-1][j][k],f[i-1][j-m[i]][k-v[i]]+w[i]);
滚动数组优化
应为每次只涉及到第i个之前的问题,所以可以优化为
f[j][k]表示在可承受重量为j,体积为k时的最大价值;
f[j][k]=max(f[j][k],f[i-m[i]][k-v[i]]+w[i]);
C++代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=110;
int f[M][M],w[N],v[N],m[N];
int main()
{
int ni,mi,vi;
cin>>ni>>vi>>mi;
for(int i=1;i<=ni;i++) cin>>v[i]>>m[i]>>w[i];
for(int i=1;i<=ni;i++)
for(int j=mi;j>=m[i];j--)
for(int k=vi;k>=v[i];k--)
f[j][k]=max(f[j][k],f[j-m[i]][k-v[i]]+w[i]);
cout<<f[mi][vi]<<endl;
return 0;
}