/*----------------------------------------------------- 給出n個物體,第i個物體的重量為wi。 選擇盡量多的物體,使得總重量不超過C。 輸入: n和C以及n個整數表示的wi。 輸出: 按照輸入物體的順序輸出n個用空格分隔的Y或N。 Y表示該物體被選中,N表示不被選中。 最后一行輸出所選中的物體的個數num和總重量w,用空格分隔。
注意:這個地方每個物體是不可再分割的整體。 思路: 先把所有物體按重量排序(從小到大排序) , 然后貪心選擇重量比較小的物體直到所選物體的總重量超過所允許的最大重量C 。 -------------------------------------------------------*/
輸入案例:
10 100
20
20
5
25
28
10
3
4
8
9
輸出案例:
Y Y Y N N Y Y Y Y Y
79 8

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 struct obj 5 { 6 int weight; 7 int id; 8 int flag;//標示該物體是否被選中。 0標示未被選中,1表示被選中。 9 }; 10 11 void merge_sort1(struct obj *A,int x,int y,struct obj *T);//采用歸並排序對A數組排序。按struct obj的weight從小到大排序。 12 void merge_sort2(struct obj *A,int x,int y,struct obj *T);//采用歸並排序對A數組排序。按struct obj的id從小到大排序。 13 14 int cmp1(struct obj a,struct obj b);//按struct obj的weight比較a和b的大小 15 int cmp2(struct obj a,struct obj b);//按struct obj的id比較a和b的大小 16 int cmpQsort1(const void *a,const void *b);//按struct obj的weight比較a和b的大小 17 int cmpQsort2(const void *a,const void *b);//按struct obj的id比較a和b的大小 18 19 int main() 20 { 21 int n,c,i,w,num; 22 struct obj *arr,*T; 23 freopen("5.in","r",stdin); 24 scanf("%d%d",&n,&c); 25 arr=(struct obj *)malloc(sizeof(struct obj)*n); 26 T=(struct obj *)malloc(sizeof(struct obj)*n); 27 for(i=0;i<n;i++) 28 { 29 scanf("%d",&arr[i].weight); 30 arr[i].id=i+1; 31 arr[i].flag=0; 32 } 33 qsort(arr,n,sizeof(struct obj),cmpQsort1); 34 //merge_sort1(arr,0,n,T);//按重量排序 35 /*for(i=0;i<n;i++) printf("%-3d %-3d\n",arr[i].weight,arr[i].id); 36 printf("\n"); 37 merge_sort2(arr,0,n,T);//按id排序 38 for(i=0;i<n;i++) printf("%-3d %-3d\n",arr[i].weight,arr[i].id);*/ 39 40 w=0;//所選物體的總重量 41 num=0;//所選物體的個數 42 for(i=0;i<n;i++) 43 { 44 w=w+arr[i].weight;//選中arr[i] 45 arr[i].flag=1; 46 num++;//選中的個數加1 47 if(w>c) 48 { 49 w-=arr[i].weight; 50 arr[i].flag=0; 51 num--; 52 break; 53 } 54 } 55 qsort(arr,n,sizeof(struct obj),cmpQsort2); 56 //merge_sort2(arr,0,n,T);//按id排序 57 for(i=0;i<n;i++)//其實被選中的個數和總重量可以在這個for里面統計。但是總重量不管如何在前面貪心選擇的過程中都該要記錄的。 58 { 59 if(arr[i].flag==1) printf("Y "); 60 else printf("N "); 61 } 62 printf("\n%d %d\n",w,num); 63 64 free(arr); 65 free(T); 66 return 0; 67 } 68 void merge_sort1(struct obj *A,int x,int y,struct obj *T) 69 {//采用歸並排序對A數組排序。按struct obj的weight從小到大排序。 70 if(y-x>1) 71 { 72 int m=x+(y-x)/2; //划分 73 int p=x,q=m,i=x; 74 merge_sort1(A,x,m,T); 75 merge_sort1(A,m,y,T); 76 while(p<m||q<y) 77 { 78 //if(q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++]; 79 if(q>=y||(p<m&&A[p].weight<=A[q].weight)) T[i++]=A[p++]; 80 //if(q>=y||(p<m&&cmp1(A[p],A[q])==-1)) T[i++]=A[p++]; 81 else T[i++]=A[q++]; 82 } 83 for(i=x;i<y;i++) A[i]=T[i]; 84 } 85 } 86 void merge_sort2(struct obj *A,int x,int y,struct obj *T) 87 {//采用歸並排序對A數組排序。按struct obj的id從小到大排序。 88 if(y-x>1) 89 { 90 int m=x+(y-x)/2; //划分 91 int p=x,q=m,i=x; 92 merge_sort2(A,x,m,T); 93 merge_sort2(A,m,y,T); 94 while(p<m||q<y) 95 { 96 //if(q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++]; 97 if(q>=y||(p<m&& A[p].id<=A[q].id)) T[i++]=A[p++]; 98 //if(q>=y||(p<m&&cmp2(A[p],A[q])==-1)) T[i++]=A[p++]; 99 else T[i++]=A[q++]; 100 } 101 for(i=x;i<y;i++) A[i]=T[i]; 102 } 103 } 104 int cmp1(struct obj a,struct obj b) 105 {//按struct obj的weight比較a和b的大小 106 if(a.weight>b.weight) return 1; 107 else if(a.weight<b.weight) return -1; 108 else return 0; 109 } 110 int cmp2(struct obj a,struct obj b) 111 {//按struct obj的id比較a和b的大小 112 if(a.id>b.id) return 1; 113 else if(a.id<b.id) return -1; 114 else return 0; 115 } 116 int cmpQsort1(const void *a,const void *b) 117 {//按struct obj的weight比較a和b的大小 118 int t=((struct obj *)a)->weight-((struct obj *)b)->weight; 119 if(t>0) return 1; 120 else if(t<0) return -1; 121 else return 0; 122 } 123 int cmpQsort2(const void *a,const void *b) 124 {//按struct obj的id比較a和b的大小 125 int t=((struct obj *)a)->id-((struct obj *)b)->id; 126 if(t>0) return 1; 127 else if(t<0) return -1; 128 else return 0; 129 }