貪心算法:最優裝載問題


/*-----------------------------------------------------
給出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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM