東 華 大 學
《算法設計分析與綜合實踐》分析題作業
學生姓名:曹晨 學號: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);