定義每個古董重量
揹包問題
在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解(是否是全域性最優,需要證明)。
有一天海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件都價值連城,一旦打碎就是去了價值,海盜船載重量為c,每件固定的重量為wi,海盜們該如何盡可能裝載最多數量的古董呢?
船載重量固定為c,只要每次選擇重量最小的古董,直到不能再裝為止,這樣裝載的古董數量最大,這就是貪心策略;
把古董按重量從小到大排序,根據策略選出盡可能多的古董。
antique =[4
,10,7
,11,3
,5,14
,2]def
max_ans
(antique)
: anti_sort =
sorted
(antique)
# 對重量排序
ans, tmp =0,
0# ans記錄裝載古董數量,tmp記錄裝載古董重量
ship =
# 記錄裝載的古董
for a in anti_sort:
tmp += a
if tmp <=30:
ans +=
1print
('裝載古董數量:'
, ans)
print
('裝載的古董'
, ship)
max_ans(antique)
假設山洞中有n種寶物,每種寶物有一定重量w和相應的價值v,毛驢運載能力一種寶物只能拿一樣,寶物可分割。怎樣才能使毛驢運走寶物的價值最大呢?
可以嘗試三種貪心策略:
每次挑選價值最大的裝東西入揹包;
每次挑選最重的東西;
每次選取單位重量價值最大的東西。
很顯然,本題目我們應該選擇第三種策略:
計算出每件寶物的價效比,按照從高到低排序;
根據貪心策略,按價效比從大到小選取寶物,直到達到毛驢的運載能力。每次選擇寶物後判斷是否小於m,如果不小於則取走寶物的一部分,程式結束。
# datas中每個元素代表乙個古董,每個列表第乙個元素代表古董重量,第二個元素代表古董價值
datas =[[
4,3]
,[2,
8],[
9,18]
,[5,
6],[
5,8]
,[8,
20],[
5,5]
,[4,
6],[
5,7]
,[5,
15]]m =
30# 毛驢運載能力
w =0
# 獲取的總價值
# 計算出每件寶物的價效比,按照從高到低排序
for i in
range
(len
(datas)):
price = datas[i][1
]/ datas[i][0
] datas[i]
# 增加價效比
datas.sort(key=
lambda data: data[2]
, reverse=
true
)# 按價效比排序
# 按價效比從大到小選取寶物,直到達到毛驢的運載能力
for data in datas:
if data[0]
<= m:
w += data[1]
m -= data[0]
else
: w += data[2]
* m # 取走寶物的一部分
break
print
('總價值:'
,w)
想一下如果寶物不可分割,貪心演算法得到的是否是最優解?
注意:物品可分割的裝載問題稱為揹包問題,不可分割問題的裝載問題稱為0-1揹包問題。
0-1揹包問題不具有貪心選擇性質,貪心演算法不能得到全域性最優解,僅僅是最優解的近似解。
0-1揹包問題可用動態規劃演算法求解。
資料結構與演算法 貪心演算法
1 給定 n 種物品和乙個揹包,物品 i 的重量是 w i 其價值是 p i 揹包的容量為 c。設物品已按單位重量價值遞減的次序排序。每種物品不可以裝入揹包多次,但可以裝入部分的物品 i。揹包問題是選擇裝入揹包中的物品,在不超過揹包容量的前提下使揹包的得總價值最大。用貪心法設計與實現乙個演算法,求解...
資料結構與演算法 貪心演算法
有如下場景 針對一組資料,我們定義了限制值和期望值,希望從中選出幾個資料,在滿足限制值的情況下,期望值最大。為了達到上述目的,貪心演算法是其中的乙個解決方案。例如,路徑選擇問題,從 s 城市至 e 城市,在只能路過 2 個城市的情況下,如何走的最短,如下圖所示 英文全稱 greedy algorit...
資料結構與演算法 (2)貪心演算法
貪心演算法在對問題進行求解時,總是做出在當前看來最好的選擇,即不從整體最優上加以考慮,而是進行某種意義上的區域性最優解。一般將求解過程分成若干個步驟,但每個步驟都應用貪心原則,選取當前狀態下最好 最優的選擇 區域性最有利的選擇 並以此希望最後堆疊出的結果也是最好 最優的解 分析 1.確定初始位置和能...