2829: 闯关游戏http://acm.zzuli.edu.cn/problem.php?id=2829
#include<bits/stdc++.h>
using namespace std;
int f[6010];
int main()
{
int t;cin>>t;
while(t--)
{
memset(f,0,sizeof f);
int n,h;cin>>n>>h;
int cnt=0,flag=0,ans=0;
for(int i=1;i<=n;i++)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
if(flag==1) continue;
if(a>c) //当a>c的时候 交换a,c b,d;为了一会方便计算
{
swap(a,c);
swap(b,d);
}
if(h<a)//当体力小于最小的选择时则结束游戏
{
flag=1;
continue;
}
cnt+=b,h-=a;//先选择一种方案
c-=a,d-=b;
for(int j=h;j>=c;j--)
f[j]=max(f[j],f[j-c]+d);//代表另一种方案
ans=max(ans,cnt+f[h]);
}
cout<<ans<<endl;
}
return 0;
}