[4.27] T2-灵魂分流药剂

题目大意

你拥有 N N 瓶药剂,按照成分配比的不同装在 M M 个箱子中。每瓶药剂的有以下参数:对服用者造成的肉体伤害 w w ,精神伤害 v v ,所属的箱子 t t ,和对服用者造成的痛苦程度 p p

人类探子的生命值为 A A ,意志力为 B B 。你只能从每个箱子中最多拿取 1 1 瓶药剂喂给他。注意,喂给他的药剂造成的总肉体伤害不能超过他的生命值 A A ,否则他会死去,总的精神伤害不能超过他的意志力 B B ,否则他会精神崩溃。在不让他死去而且没有精神崩溃的前提下,你要尽可能给他制造更多的痛苦。

题目解析

要使痛苦值最大,我们可以把痛苦值看成一种价值,把服用者的生命值与意志力看作一个二维背包,把每瓶药剂的肉体折磨于意志折磨分别看作物品花费的两个维度。

由于每个箱子中只能取出一瓶药剂,所以要以每个箱子作为阶段

f [ i ] [ j ] [ k ] f[i][j][k] 表示当服用者拥有 i i 的生命值, j j 的意志力,且只用了前 k k 个箱子的药剂时所造成的最大痛苦值。

代码

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43909855/article/details/89601471
今日推荐