CCh99

贪心分析题

东 华 大 学

《算法设计分析与综合实践》分析题作业

 

学生姓名:曹晨 学号:171310402

  1. 作业题目

    有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为w。最优装载问题要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。将最优装载问题的贪心算法推广到2艘船的情形,贪心算法仍能产生最优解吗?

  2. 解题过程(针对算法设计题)
  3. 简明扼要地写出解题思路或算法设计思路。可用文字、图等描述

    假设有两艘船A和B,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),将尽可能多的集装箱装上轮船。

    用贪心算法解决一下这个问题:

    要能装最够多的集装箱,应使得每装集装箱时,就和船的剩余容量比一下,和哪个船的差值大的就装入哪个集装箱里,从而可以保证能有更多的空间装箱子。

     

  4. 写出算法描述(要有每个步骤加数字标号,必要的地方加注释,注释用双斜杠//表示),例如:

    算法描述:

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

由此可以得出结论,贪心算法不能得出最优解

  1. 算法分析:

时间复杂度:

用了一个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);

 

posted on 2019-04-08 21:58  CCh99  阅读(1103)  评论(0编辑  收藏  举报

导航