BOJ1495 Schoolbag

342 阅读1分钟

题目大意

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


    }
}