灵魂分流药剂【背包】
题目大意:
题目链接:http://10.156.31.134/contestnew.aspx?cid=123 (学校局域网)
有个箱子,每个箱子里最多可以取1个东西。每个东西有三个参数,求在满足的最大值。
思路:
显然分组背包。
设表示选到第个箱子,参数之和分别为的最大值。
枚举箱子里的东西,显然转移方程为
最终答案就是
时间复杂度,表示东西的总个数。
代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int M=15,N=110;
int n,m,A,B,ans,f[M][N][N],a[N],b[N],v[N],q[M][N],sum[M];
int main()
{
scanf("%d%d%d%d",&n,&m,&A,&B);
for (int i=1;i<=n;i++)
{
int x;
scanf("%d%d%d%d",&a[i],&b[i],&x,&v[i]);
q[x][++sum[x]]=i;
}
for (int i=1;i<=m;i++)
{
for (int j=1;j<=sum[i];j++)
{
int x=a[q[i][j]],y=b[q[i][j]],z=v[q[i][j]];
for (int k=x;k<=A;k++)
for (int l=y;l<=B;l++)
f[i][k][l]=max(f[i][k][l],f[i-1][k-x][l-y]+z);
}
for (int j=0;j<=A;j++)
for (int k=0;k<=B;k++)
f[i][j][k]=max(f[i][j][k],f[i-1][j][k]);
}
for (int i=0;i<=A;i++)
for (int j=0;j<=B;j++)
ans=max(ans,f[m][i][j]);
printf("%d",ans);
return 0;
}