题目大意算法
Clair 有一个容量为V的书包,有N本体积为book[i]的书,还有M份体积为paper[i]的纸,若是把纸折叠,纸的体积就变为[paper[i]/2](不大于paper[i]/2的整数),问在不超过背包容量的状况下,怎么装更多数量的的物品markdown
输入第一行是case的数量,第二行分别是N,M,V,接下来的N行是书的体积,M行是纸的体积spa
sample inputcode
1orm
2 1 5排序
10input
5it
2io
sample outputtable
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); } }复制代码