版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/86658234
不想描述了。。。
我好菜啊。。。
多重背包
#pragma GCC optimize(2)
#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int t,u,v,text,n,m,p,f[50001],len,q,ans,w[5001],c[5001];
inline char Getchar()
{
static char buf[1000000],*p1=buf+1000000,*pend=buf+1000000;
if(p1==pend)
{
p1=buf; pend=buf+fread(buf,1,1000000,stdin);
if (pend==p1) return -1;
}
return *p1++;
}
inline long long read()
{
char c;int d=1;long long f=0;
while(c=Getchar(),!isdigit(c))if(c==45)d=-1;f=(f<<3)+(f<<1)+c-48;
while(c=Getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
return d*f;
}
signed main()
{
text=read();
while(text--)
{
n=read();m=read();p=read();
memset(f,0,sizeof(f));len=0;
for(register int i=1;i<=n;i++)
{
t=read();u=read();v=read();
for(register int j=1;j<=v;v-=j,j<<=1) c[++len]=t*j,w[len]=u*j;
if(v) c[++len]=t*v,w[len]=u*v;
}
for(register int i=1;i<=len;i++)
for(register int j=50000;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+c[i]);
q=0;
for(register int i=1;i<=50000;i++)
if(f[i]>=p)
{
q=i;
break;
}
if(!q) {puts("TAT");for(register int i=1;i<=m;i++) read(),read(),read();continue;}
len=0;memset(f,0,sizeof(f));
for(register int i=1;i<=m;i++)
{
t=read();u=read();v=read();
for(register int j=1;j<=v;v-=j,j<<=1) c[++len]=t*j,w[len]=u*j;
if(v) c[++len]=t*v,w[len]=u*v;
}
for(register int i=1;i<=len;i++)
for(register int j=50000;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+c[i]);
ans=0;
for(register int i=1;i<=50000;i++)
if(f[i]>=q)
{
ans=i;
break;
}
if(!ans) puts("TAT");
else printf("%d\n",ans);
}
}