贪心算法求解装载问题C语言,贪心算法:最优装载问题

1 #include

2 #include

3

4 structobj5 {6 intweight;7 intid;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 intmain()20 {21 intn,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

35 /*for(i=0;i

",arr[i].weight,arr[i].id);36 printf("

");37 merge_sort2(arr,0,n,T);//按id排序38 for(i=0;i

",arr[i].weight,arr[i].id);*/

39

40 w=0;//所选物体的总重量

41 num=0;//所选物体的个数

42 for(i=0;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(structobj),cmpQsort2);56 //merge_sort2(arr,0,n,T);//按id排序

57 for(i=0;i

58 {59 if(arr[i].flag==1) printf("Y");60 else printf("N");61 }62 printf("%d %d",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=y||(p

79 if(q>=y||(p=y||(p

81 else T[i++]=A[q++];82 }83 for(i=x;i

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=y||(p

97 if(q>=y||(p=y||(p

99 else T[i++]=A[q++];100 }101 for(i=x;i

106 if(a.weight>b.weight) return 1;107 else if(a.weight

112 if(a.id>b.id) return 1;113 else if(a.id

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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值