AcWing 8. 二维费用的背包问题
二维费用的背包问题
状态表示:
f[i][j][k]
只从前i个物品中选,总体积不超过j,且总重量不超过k的所有选法集合的最大值。
状态计算:
f[i][j][k]=max(f[i-1][j][k],f[i-1][j-v1][k-v2]+w)
状态转移方程计算:
for(int j=V;j>=v;j--)
for(int k=M;k>=m;k--)
f[j][k]=max(f[j][k],f[j-v][k-m]+w);
AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=110;
int f[N][N];
int main()
{
int n,V,M;
cin>>n>>V>>M;
for(int i=0;i<n;i++)
{
int v,m,w;
cin>>v>>m>>w;
for(int j=V;j>=v;j--)
for(int k=M;k>=m;k--)
f[j][k]=max(f[j][k],f[j-v][k-m]+w);
}
cout<<f[V][M]<<endl;
return 0;
}