貪心分析題


東 華 大 學

《算法設計分析與綜合實踐》分析題作業

 

學生姓名:曹晨 學號: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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM