题目大意
你拥有 瓶药剂,按照成分配比的不同装在 个箱子中。每瓶药剂的有以下参数:对服用者造成的肉体伤害 ,精神伤害 ,所属的箱子 ,和对服用者造成的痛苦程度 。
人类探子的生命值为 ,意志力为 。你只能从每个箱子中最多拿取 瓶药剂喂给他。注意,喂给他的药剂造成的总肉体伤害不能超过他的生命值 ,否则他会死去,总的精神伤害不能超过他的意志力 ,否则他会精神崩溃。在不让他死去而且没有精神崩溃的前提下,你要尽可能给他制造更多的痛苦。
题目解析
要使痛苦值最大,我们可以把痛苦值看成一种价值,把服用者的生命值与意志力看作一个二维背包,把每瓶药剂的肉体折磨于意志折磨分别看作物品花费的两个维度。
由于每个箱子中只能取出一瓶药剂,所以要以每个箱子作为阶段
设 表示当服用者拥有 的生命值, 的意志力,且只用了前 个箱子的药剂时所造成的最大痛苦值。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,A,B,t;
int l[11],r[11],f[105][105][11];
struct data
{
int w,v,t,p;
}a[105];
bool cmp(data a,data b)
{
return a.t<b.t;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&A,&B);
for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&a[i].w,&a[i].v,&a[i].t,&a[i].p);
sort(a+1,a+1+n,cmp);
t=1;
l[1]=1;
for(int i=1;i<=n;i++)
{
if(a[i].t!=a[i-1].t)
{
r[a[i-1].t]=i-1;
l[a[i].t]=i;
}
}
r[a[n].t]=n;
for(int i=1;i<=A;i++)
for(int j=1;j<=B;j++)
for(int k=1;k<=m;k++)
{
f[i][j][k]=f[i][j][k-1];
for(int x=l[k];x<=r[k];x++)
if(i-a[x].w>=0&&j-a[x].v>=0)
f[i][j][k]=max(f[i][j][k],f[i-a[x].w][j-a[x].v][k-1]+a[x].p);
}
printf("%d",f[A][B][m]);
return 0;
}