数据结构之装箱问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目]第1.2装箱问题
一.实验内容:
有一批集装箱要装上一艘载重量为的轮船。其中集装箱i的重量为w。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
二.实验目的:
任意的c及任意的集装箱没,输出最优解。
三.实验设计思想:
根据题目,要求在不超过重量的前提下,尽可能多的装入更多的集装箱,因而我们可以采用贪婪算法,先按集装箱的重量大小将集装箱从小到大进行排序,然后在按从小到大的次序一个一个装上轮船,我们采用一维数组,用线性表的顺序存储结构保存每个集装箱重量的值,接着我们先用直接选择法对集装箱进行排序,然后我们便可以很容易的实现先装入重量轻的货物了,也就可以达到尽可能多的装入货物的目的了。
程序的框架和流程图:
(1)定义常量max;
(2)编写直接选择法排序的函数sort();
(3)编写选择集装箱的函数select();
(4)编写主函数,先输入货船的最大载重量,然后输入集装箱的总数和每个集装箱的重量,调用排序函数sort()和选择函数select()输出最优解。
Sort()函数的流程图:
定义i ,j,k,temp
i=0
i k=i j=i+1 j w[j] temp=w[k]; w[k]=w[i]; w[i]=temp; j++ i++ END Select()函数的流程图: 定义i,s=0 i=0 i s+=w[i] s 打印w[i] break i++ return i END main函数流程图: 定义a[max],x,n,c,i=0,s 打印输入信息,输入c,n的值 输入x a[i]=x i++ i 调用sort(); 调用select(); 打印输出信息 END 四.程序的源代码: #include #define max 10000 void sort(int *w,int n)//对集装箱进行直接选择排序{int i,j,k,temp; for(i=0;i {k=i; for(j=i+1;j if(w[j] temp=w[k]; w[k]=w[i]; w[i]=temp; } } int select(int *w,int n,int c)//挑选轻的集装箱先上船,c为载重量,w为排完序的集装箱 {int i,s=0; for(i=0;i {s+=w[i]; if(s<=c)printf("%d ",w[i]); else break; } return i; } void main() { int a[max]; int x; int n; //箱子的个数 int c; //船的载重量 int i=0; int s; printf("请输入货船的载重量c:\n"); scanf("%d",&c); printf("请输入箱子的个数n:\n"); scanf("%d",&n); printf("请输入所有每个的箱子的重量:\n"); do{ scanf("%d",&x); *(a+i)=x; i++; }while(i sort(a,n);//排序 printf("装入货船的箱子如下所示:"); s=select(a,n,c);//选轻的上船 printf("\n最后装入船的箱子总数s:"); printf("%d\n",s); } 五.程序的使用方法: 以10个集装箱为例,一开始会提示“请输入货船的载重量c:”操作人输入货船的载重量,然后提示“请输入箱子的个数n:”操作人输入集装箱的总个数,接着又会提示“请输入所有每个的箱子的重量:”操作者输入每个集装箱的重量,每输入一个用回车间隔,待输入数目达到定义的数目10时,程序就会给出装箱的选择和装上货船的集装箱总数,至此,对任意的c及任意的集装箱,输出最优解的任务完成。 六.程序的测试结果: 请输入货船的载重量c: 100 请输入箱子的个数n: 10 请输入所有每个的箱子的重量: 3 6 23 11 7 9 10 3 4 31 29 装入货船的箱子如下所示:3 6 7 9 10 11 23 29 最后装入船的箱子总数s:8 Press any key to continue 七.程序设计心得: 通过课程设计的过程,巩固和了解了线性表顺序存储结构的排序算法,加深了对数据结构的理解和认识。同时也了解到数据结构同我们的日常生活息息相关,算法的思想将对我们今后的生活的工作有所帮助。