济南学习 Day1 T3 am

凝视
【问题描述】
背包是个好东西,希望我也有。
给你一个二维的背包,它的体积是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\n",ans);
39     }
40 
41     return 0;
42 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七情六欲·

学生党不容易~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值