题目大意
Clair 有一个容量为V的书包,有N本体积为book[i]的书,还有M份体积为paper[i]的纸,如果把纸折叠,纸的体积就变为[paper[i]/2](不大于paper[i]/2的整数),问在不超过背包容量的情况下,怎么装更多数量的的物品
输入第一行是case的数量,第二行分别是N,M,V,接下来的N行是书的体积,M行是纸的体积
sample input
1
2 1 5
10
5
2
sample output
1
Note:在示例中Claire可以带体积为5的书,也可以带体积为2的纸
#include <stdio.h>
#include <memory.h>
#define TEST
int cas,n,m,v;
int a[20010];
void merge(int x,int mid,int y){//分治排序
int d[20010];
int h=x,r=mid+1,t=y;
int k=0;
while(h<=mid&&r<=y){
if(a[h]<a[r]){
d[k++]=a[h];
h++;
}
else{
d[k++]=a[r];
r++;
}
}
while(h<=mid){d[k++]=a[h++];}
while(r<=y){d[k++]=a[r++];}
int i=0;
for (i=0;i<k;i++)
{
a[x+i]=d[i];
}
}
void mergesort(int x,int y){//分治排序算法
int mid;
if (x>=y)
return;
mid=(x+y)/2;
mergesort(x,mid);
mergesort(mid+1,y);
merge(x,mid,y);
}
int main(){
#ifdef TEST
freopen("test.txt","r",stdin);
freopen("testout.txt","w",stdout);
#endif
scanf("%d\n",&cas);
int i,j,k;
for (i=0;i<cas;i++)
{
int tmp;
memset(a,0,sizeof(a));
scanf("%d %d %d\n",&n,&m,&v);
for (j=0;j<n;j++)
scanf("%d\n",&a[j]);
for(j=n;j<n+m;j++){
scanf("%d\n",&tmp);
a[j]=tmp/2;//读取的时候对纸进行折叠
}
mergesort(0,n+m-1);//把物品从小到大排序
int weigh=0;
j=0;
while(j<n+m){//把排好的物品装入书包
weigh+=a[j];
if(weigh>v)
break;
else
j++;
}
printf("%d\n",j);
}
}