贪心算法:最优装载问题

/*-----------------------------------------------------
给出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
  2 #include
  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;ic) 
 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;i1)
 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=y||(p=y||(p=y||(p1)
 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=y||(p=y||(p=y||(pb.weight) return 1;
107     else if(a.weightb.id) return 1;
113     else if(a.idweight-((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 }

你可能感兴趣的:(贪心算法,算法)