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