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

2021-10-04 04:18:23 字數 1989 閱讀 6405

在北美洲東南部,有一片神秘的海域,那裡碧海藍天、陽光明媚,這,正式傳說中海盜最活躍的加勒比海(caribbean sea)。17世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜們不僅攻擊過往商人,甚至攻擊英國皇家艦…… 

有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎就失去了它的價值。雖然海盜船足夠大,載重量為c,每件古董的重量為wi

,海盜們如何把盡可能多數量的寶貝裝上海盜船呢?

問題分析

​ 首先要確定貪心策略,選擇乙個你認為最好的方案,運用貪心演算法的缺點就是可能得不到最優解

​ 這道題要求古董的數量盡可能多,而船的容量是固定的,那麼優先把重量小的物品放進去,在容量固定的情況下,裝的物品最多,這裡我就採用這種策略。

演算法設計

​ 按照貪心策略,每次選擇重量最小的古董放入(tmp代表古董的重量,ans代表已經裝載的古董的個數)。

i選擇排序後第幾個

裝入重量tmp

是否超重載重量

ans值

i=0第乙個

tmp=2否1

i=1第二個

tmp=2+3=5否2

i=2第三個

tmp = 5+4=9否3

i=3第四個

tmp=9+5=14否4

i=4第五個

tmp=14+7=21否5

i=5第六個

tmp=21+10=31

超過演算法結束

偽**詳解

資料結構定義

根據演算法設計描述,我們用一維陣列儲存古董數量:

double w[n]

;//一維陣列儲存古董的重量

按重量排序

可以利用c++標準庫中的排序函式sort,對古董的重量進行從小到大(非遞減)排序。要使用此函式需要引入標頭檔案

語法描述為:

sort

(begin, end)

//引數begin和end表示乙個範圍,分別為待排序陣列的首位址和尾位址

//sort函式預設公升序

sort

(w, w+n)

;

大家都會了嗎?自己親手試試吧!先不要往下看,自己思考才是最好的?

**

#include

#include

using

namespace std;

const

int n =

101;

//陣列不用定義太多

double w[n]

;int

main()

sort

(w, w + n)

;double

= tmp =

0.0;

int ans =0;

for(

int i =

0; i < n; i++

)else

} cout <<

"能裝入的古董最大數為ans="

; cout << ans << endl;

return0;

}

演算法實現和測試

執行環境

visual studio2019

輸入

請輸入載重量c及古董個數:

30 8

請輸入每個古董的重量,用空格分開:

4 10 7 11 3 5 14 2

輸出重量c及古董個數:

>

> 30 8

>

> 請輸入每個古董的重量,用空格分開:

>

> 4 10 7 11 3 5 14 2

輸出

能裝入的古董最大數為ans=5

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

在北美洲東南部,有一片神秘的海域,那裡碧海藍天 陽光明媚,這正是傳說中海盜最活躍的加勒比海。17 世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎...

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

在北美洲南部,有一篇神秘的海域,那裡碧海藍天 陽光明媚。這正是傳說中海盜最活躍的加勒比海。17世紀時,這裡更是歐洲大陸的商旅艦隊到達美洲的必經之地,所以當時的海盜活動非常猖獗,海盜不僅攻擊過往商人,甚至攻擊英國皇家艦 有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎就失...

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

有一天,海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件古董都價值連城,一旦打碎就失去了它的價值。雖然海盜船足夠大,但載重量為c,每件古董的重量為wi,海盜們該如何把盡可能多數量的寶貝裝上海盜船呢?include 呼叫sort函式的標頭檔案 includeusing namespace std c 定...