在北美洲南部,有一篇神秘的海域,那裡碧海藍天、陽光明媚。這正是傳說中海盜最活躍的加勒比海。17世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜不僅攻擊過往商人,甚至攻擊英國皇家艦…
有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎就失去了它的價值,雖然海盜船足夠大,但載重量為c,沒見古董的重量為wi,海盜們該如何把盡可能多數量的寶貝裝上海盜船呢?
根據問題描述可知這是乙個可以用貪心演算法求解的最優裝載問題,要求裝載的物品的數量盡可能多,而船的容量是固定的,那麼優先把重量小的物品放進去,在容量固定的情況下,裝的物品最多。採用重量最輕者先裝的貪心選擇策略,從區域性最優達到全域性最優,從而產生最優裝載問題的最優解。
(1)當載重量為定值c時,wi越小時,可裝載的古董數量n越大。只要依次選擇最小重量的古董,直到不能再裝為止;
(2)把n個古董的重量從小到大(非遞減)排序,然後根據貪心策略盡可能多地選出前i個古董,直到不能繼續裝為止,此時達到最優;
例如:古董的重量清單
根據重量排完序的重量
根據貪心策略,每次選擇重量最小的古董放入(tmp代表已裝入古董的重量,ans代表已裝載的古董個數)。
次數選擇
已裝重量
是否超重
裝入個數
i=0選擇排序後的第1個
裝入重量tmp=2
低於c=30
ans=1
i=1選擇排序後的第2個
裝入重量tmp=2+3=5
低於c=30
ans=2
i=2選擇排序後的第3個
裝入重量tmp=5+4=9
低於c=30
ans=3
i=3選擇排序後的第4個
裝入重量tmp=9+5=14
低於c=30
ans=4
i=4選擇排序後的第5個
裝入重量tmp=14+7=21
低於c=30
ans=5
i=5選擇排序後的第6個
裝入重量tmp=21+10=31
超過c=30
演算法結束
即放入古董的個數為ans=5個
根據演算法設計描述,我們用一維陣列儲存古董的重量:
double w[n]
;//一維陣列儲存古董的重量
可以利用c++中的排序函式sort
,對古董的重量進行從小到大(非遞減)排序。要使用此函式需引入標頭檔案:
#include
sort
(begin, end)
//引數begin和end表示乙個範圍,分別為待排序陣列的首位址和尾位址
//sort 函式預設為公升序
在本例中只需要呼叫sort 函式對古董的重量進行從小到大排序:
sort
(w, w+n)
;//按古董重量公升序排序
首先用變數ans記錄已經裝載的古董個數,tmp代表裝載到船上的古董的重量,兩個變數都初始化為0。然後按照重量從小到大排序,依次檢查每個古董,tmp加上該古董的重量,如果小於等於載重量c,則令ans++;否則,退出。
//tmp 代表裝載到船上的古董的重量,ans 記錄已經裝載的古董個數
int tmp =
0, ans =0;
for(
int i=
0; i
)
#include
#include
const
int n =
1000005
;using namespace std;
double w[n]
;//古董的重量陣列
intmain()
sort
(w,w+n)
;//tmp 代表裝載到船上的古董的重量,ans 記錄已經裝載的古董個數
double tmp =
0.0;
int ans =0;
for(
int i=
0; i
) cout<<
"能裝入的古董最大數量為ans="
; cout<
return0;
}
首先需要按古董重量排序,呼叫sort函式,其平均時間複雜度為o(nlogn),輸入和貪心策略求解的兩個for語句時間複雜度均為o(n),因此時間複雜度為o(n+nlogn)。
程式中變數tmp、ans等占用了一些輔助空間,這些輔助空間都是常數階的,因此空間複雜度為o(1)。
加勒比海盜船 最優裝載問題 貪心演算法
在北美洲東南部,有一片神秘的海域,那裡碧海藍天 陽光明媚,這,正式傳說中海盜最活躍的加勒比海 caribbean sea 17世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜們不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,...
貪心 加勒比海盜船 最優裝載問題
在北美洲東南部,有一片神秘的海域,那裡碧海藍天 陽光明媚,這正是傳說中海盜最活躍的加勒比海。17 世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎...
貪心演算法 加勒比海盜 最優裝載問題
有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎就失去了它的價值。雖然海盜船足夠大,但載重量為c,每件古董的重量為wi,海盜們該如何把盡可能多數量的寶貝裝上海盜船呢?include 呼叫sort函式的標頭檔案 includeusing namespace std c 定...