2019.01.26【NOIP提高组】模拟B组 JZOJ 4224 食物

版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/86658234

D e s c r i p t i o n Description

不想描述了。。。
我好菜啊。。。


S o l u t i o n Solution

s b sb 多重背包


C o d e Code

#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);
	}
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/86658234