JZOJ 4224. 【五校联考3day1】食物


题目:

传送门


题意:

给出每个食物和运输工具的信息,求在不花费超过 50000 50000 50000并且美味值达到 p p p的情况下的最小代价


分析:

多重背包后在来一次多重背包


代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<list>
#include<ctime>
#include<iomanip>
#include<string>
#include<bitset>
#include<deque>
#include<set>
#define LL long long
using namespace std;
inline LL read(){
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
LL v[2005],w[2005],x[205],y[205],z[205];
LL g[50105],f[205][50105];
int main()
{
	LL q=read();
	while(q--)
	{
		memset(v,0,sizeof(v));
		memset(w,0,sizeof(w));
		memset(g,0x3f3f3f3f,sizeof(g));
		memset(f,0,sizeof(f));
		LL n=read(),m=read(),p=read();
		LL maxp=p;
		for(LL i=1;i<=n;i++)
		{
			LL t=read(),u=read(),v_=read();
			maxp=max(maxp,t);
			LL s=1;
			while(v_>s)
			{
				v[0]++;
				v[v[0]]=s*t;
				w[v[0]]=s*u;
				v_-=s;
				s*=2;
			}
			if(v_) {v[0]++;v[v[0]]=v_*t;w[v[0]]=v_*u;}
		}
		for(LL i=1;i<=m;i++) x[i]=read(),y[i]=read(),z[i]=read();
		g[0]=0;
		LL king=0x7fffffff;
		for(LL i=1;i<=v[0];i++)
		  for(LL j=maxp+100;j>=v[i];j--)
		  {
		  	g[j]=min(g[j],g[j-v[i]]+w[i]);
		  	if(j>=p) king=min(king,g[j]);
		  }
		if(king>=0x7fffffff) {printf("TAT\n");continue;}
		LL ans=0x7fffffff;
		for(LL i=1;i<=m;i++)
		  for(LL j=0;j<=z[i];j++)
		    for(LL k=1;k<=50000;k++)
		    {
		    	if(j*y[i]>k) continue;
		    	f[i][k]=max(f[i][k],f[i-1][k-j*y[i]]+x[i]*j);
				if(f[i][k]>=king) {ans=min(ans,k);break;}
			}
		if(ans>50000) printf("TAT\n");
		else printf("%lld\n",ans);
	}
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值