貪心演算法 加勒比海盜船 最優裝載問題

2021-10-24 12:37:48 字數 2395 閱讀 8165

在北美洲南部,有一篇神秘的海域,那裡碧海藍天、陽光明媚。這正是傳說中海盜最活躍的加勒比海。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 定...