資料結構與演算法 貪心演算法

2021-09-25 08:47:52 字數 2055 閱讀 6005

定義每個古董重量

揹包問題

在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解(是否是全域性最優,需要證明)。

有一天海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件都價值連城,一旦打碎就是去了價值,海盜船載重量為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.確定初始位置和能...