贪心分析题
东 华 大 学
《算法设计分析与综合实践》分析题作业
学生姓名:曹晨 学号:171310402
- 作业题目
有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为w。最优装载问题要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。将最优装载问题的贪心算法推广到2艘船的情形,贪心算法仍能产生最优解吗?
- 解题过程(针对算法设计题)
- 简明扼要地写出解题思路或算法设计思路。可用文字、图等描述
假设有两艘船A和B,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),将尽可能多的集装箱装上轮船。
用贪心算法解决一下这个问题:
要能装最够多的集装箱,应使得每装集装箱时,就和船的剩余容量比一下,和哪个船的差值大的就装入哪个集装箱里,从而可以保证能有更多的空间装箱子。
- 写出算法描述(要有每个步骤加数字标号,必要的地方加注释,注释用双斜杠//表示),例如:
算法描述:
1 void Findbest(int *w,int c1,int c2,int n)//w[n]数组代表各个集装箱的重量,c1、c2分别是两个集装箱的装载重量,n时集装箱的个数
2 {
3 int x[n];//用来表示集装箱是否被转上船
4 memset(x,0,sizeof(x));//将数组初始化为0,因为刚开始没有集装箱在船上
5 sort(w,w+n);//给集装箱的重量按递增排序
6 for(int i =0 to n)
7 {
8 if(w[i]<c1&&w[i]<c2)//如果两个船所剩的装载量都不能装下,退出循环
9 break ;
10 else x[i]=1;
11 if(w[i]>=c1&&w[i]>=c2)//如果两个船的所剩集装箱都能够装下,哪个集装箱所剩的多装进哪个
12 if(c1>c2)
13 c1-=w[i];
14 else c2-=w[i]//如果A船能装,B船不能装,则装进A船
15 else if(w[i]>c1)
16 c1-=w[i];
17 else c2-=w[i];//如果B船能装,A船不能装,则装进B船
18 }
19 for(int i=0 to n)//输出集装箱是否装进船的情况
20 cout<<x[i];
21 }
输入:第一行是c1、c2和n(n<=10);
第二行n个整数表示wi (i=1…n)。
输出:第一行n个整数分别代表n个集装箱是否被转上轮船,是的话输出1,不是的话输出2
输入样例:7 3 3
3 3 4
算法的答案
轮船 | A | B |
最大装载量 | 7 | 3 |
实际装的集装箱 | 3、3 | 0 |
正确的答案
轮船 | A | B |
最大装载量 | 7 | 3 |
实际装的集装箱 | 3、4 | 3 |
由此可以得出结论,贪心算法不能得出最优解
- 算法分析:
时间复杂度:
用了一个for循环来判断装载箱是否能被装上船,一个for循环来输出最后装载箱是都被装上船的情况。
f(n)=n+n=2n=O(n);
N的大小 | 100 | 200 | 300 | 400 | 500 |
时间 | 8 | 19 | 30 | 41 | 5 |
空间复杂度:
两个一维数组,一个存储每个装载箱的重量,另一个存储该装载箱是否被装上船的情况。
f(n)= n+n=2n=O(n);