[4.27] T2-灵魂分流药剂

题目大意

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

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

题目解析

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

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

f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示当服用者拥有 i i i的生命值, j j j的意志力,且只用了前 k 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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值