1.26 4224-食物

Description

1.26 4224-食物
Input
1.26 4224-食物

Output
1.26 4224-食物

Sample Input
4
1 1 7
14 2 1
1 2 2
1 1 10
10 10 1
5 7 2
5 3 34
1 4 1
9 4 2
5 3 3
1 3 3
5 3 2
3 4 5
6 7 5
5 3 8
1 1 1
1 2 1
1 1 1

Sample Output
4
14
12
TAT

Data Constraint
1.26 4224-食物
解析:这题需要用两个多重背包问题结合去求解,一般的多重背包的时间复杂度是n^2会在这道题里会超时,这时需要nlogn的背包的时间复杂度

#include <bits/stdc++.h>
 using namespace std;
 int n,m,p,test,t,u,v,x,y,z,ans,f[100001],g[100001];
 int main()
 {
 	 	cin>>test;
 	 	while (test>0)
 	 	{
 	 		test--;
 	 		ans=0;
 	 		cin>>n>>m>>p;
 	 		memset(f,0,sizeof(f)),memset(g,0,sizeof(g)); 
 	 		for (int i=1;i<=n;i++)
 	 		{
 	 			cin>>t>>u>>v;
 	 			for (int j=1;j<=v;v-=j,j*=2) 
 	 			  for (int k=20000;k>=u*j;k--)
 	 			    f[k]=max(f[k-(u*j)]+(t*j),f[k]);
 	 			if (v)  
 	 			for (int k=20000;k>=u*v;k--)
 	 			    f[k]=max(f[k-(u*v)]+(t*v),f[k]);
			} 	 		
 	 		for (int i=1;i<=m;i++)
 	 		{
 	 			cin>>x>>y>>z;
 	 			for (int j=1;j<=z;z-=j,j*=2)
 	 			  for (int k=50000;k>=j*y;k--)
 	 			    g[k]=max(g[k],g[k-(y*j)]+(x*j));
 	 			if (z)  
 	 			   for (int k=50000;k>=z*y;k--)
 	 			     g[k]=max(g[k],g[k-(y*z)]+(x*z));
			  }
 	 		for (int i=1;i<=50000;i++)
 	 		if (f[g[i]]>=p) 
 	 		{
 	 			ans=i;
 	 			break;
			  }
 	 		if (ans==0)
 	 		  cout<<"TAT"<<endl;
 	 		  else cout<<ans<<endl;
		  }
 }