凝视
【问题描述】
背包是个好东西,希望我也有。
给你一个二维的背包,它的体积是N*M。现在你有一些大小为1× 2和1×
3的物品,每个物品有自己的价值。你希望往背包里面装一些物品,使得它们的
价值和最大,问最大的价值和是多少。
【输入格式】
第一行一个整数T代表该测试点的数据组数。
对于每组数据,第一行有四个整数N,M,n1,n2其中n1 ,n2 分别代表大小为
1× 2和大小为1 × 3的物品个数。
1 × 2 接下来一行有? 2 个数代表每个1 × 3物品的价值。
【输出格式】
对于每组询问,输出能够达到的价值最大值。
【样例输入】
1
2 3 2 2
1 2
1 2
【样例输出】
4
【样例解释】
庙里有座山。
【数据规模与约定】
对于20%的数据,N,M<=10,n1,n2<=100
70%的数据,N,M ≤ 100,n1,n2 ≤ 2000。
对于100%的数据,1 ≤ T ≤ 10,1 ≤ N,M ≤ 500,0 ≤ n1,n2 ≤ 10000。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=10010; 7 int n,m,n1,n2,y[maxn],z[maxn],sum[maxn]; 8 bool cmp(int a,int b) 9 { 10 return a>b; 11 } 12 int main() 13 { 14 freopen("eyesight.in","r",stdin); 15 freopen("eyesight.out","w",stdout); 16 17 int t; 18 scanf("%d",&t); 19 while(t--) 20 { 21 scanf("%d%d%d%d",&n,&m,&n1,&n2); 22 for (int a=1;a<=n1;a++) 23 scanf("%d",&y[a]); 24 for (int a=1;a<=n2;a++) 25 scanf("%d",&z[a]); 26 sort(y+1,y+n1+1,cmp); 27 sort(z+1,z+n2+1,cmp); 28 for (int a=1;a<=n1;a++) 29 y[a]+=y[a-1]; 30 for (int a=1;a<=n2;a++) 31 z[a]+=z[a-1]; 32 int delta; 33 if (n%3==2 && m%3==2 && (n==2 || m==2)) delta=4; 34 else delta=n*m%3; 35 int ans=0,limit=min(n2,(n*m-delta)/3); 36 for (int a=0;a<=limit;a++) 37 ans=max(ans,z[a]+y[min(n1,(n*m-a*3)>>1)]); 38 printf("%d ",ans); 39 } 40 41 return 0; 42 }