BOJ1495 Schoolbag

题目大意

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的纸

 

 1 #include <stdio.h>
 2 #include <memory.h>
 3 #define TEST
 4 int cas,n,m,v;
 5 int a[20010];
 6 void merge(int x,int mid,int y){//分治排序
 7     int d[20010];
 8     int h=x,r=mid+1,t=y;
 9     int k=0;
10     while(h<=mid&&r<=y){
11         if(a[h]<a[r]){
12             d[k++]=a[h];
13             h++;
14         }
15         else{
16             d[k++]=a[r];
17             r++;
18         }
19     }
20     while(h<=mid){d[k++]=a[h++];}
21     while(r<=y){d[k++]=a[r++];}
22     int i=0;
23     for (i=0;i<k;i++)
24     {
25         a[x+i]=d[i];
26     }
27 }
28 void mergesort(int x,int y){//分治排序算法
29     int mid;
30     if (x>=y)
31         return;
32     mid=(x+y)/2;
33     mergesort(x,mid);
34     mergesort(mid+1,y);
35     merge(x,mid,y);
36 }
37 
38 int main(){
39 #ifdef    TEST
40     freopen("test.txt","r",stdin);
41     freopen("testout.txt","w",stdout);
42 #endif
43     scanf("%d\n",&cas);
44     int i,j,k;
45     for (i=0;i<cas;i++)
46     {
47 
48         int tmp;
49         memset(a,0,sizeof(a));
50         scanf("%d %d %d\n",&n,&m,&v);
51         for (j=0;j<n;j++)
52             scanf("%d\n",&a[j]);
53         for(j=n;j<n+m;j++){
54             scanf("%d\n",&tmp);
55             a[j]=tmp/2;//读取的时候对纸进行折叠
56         }
57         mergesort(0,n+m-1);//把物品从小到大排序
58         int weigh=0;
59         j=0;
60         while(j<n+m){//把排好的物品装入书包
61             weigh+=a[j];
62             if(weigh>v)
63                 break;
64             else
65                 j++;
66         }
67         printf("%d\n",j);
68 
69 
70     }
71 }

 

posted on 2013-03-31 00:09  止宇  阅读(158)  评论(0编辑  收藏  举报

导航