题目:
题意:
给出每个食物和运输工具的信息,求在不花费超过 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;
}