0 1 揹包 大揭秘

2021-10-02 06:49:13 字數 2375 閱讀 7018

# n:物品件數;

# c:最大承重為c的揹包;

# w:各個物品的重量;

# v:各個物品的價值;

# res[i][j]是(n+1)(c+1)的矩陣,取值從[1][1]開始, 而n[i],c[i],p[i],w[i]都是從0開始取值

defbag

(n, c, w, p)

: res =[[

-1for j in

range

(c +1)

]for i in

range

(n +1)

]# 生成(n+1)(c+1)的矩陣

for j in

range

(c +1)

:# 第0行全部賦值為0,物品編號從1開始.方便賦值

res[0]

[j]=

0# print(res)

for i in

range(1

,n +1)

:# 遍歷物品列

for j in

range(1

,c +1)

:# 遍歷容量列 標記?

res[i]

[j]= res[i -1]

[j]# 相同位置的上一行

# j >= w[i - 1]先檢視當前揹包容量是否大於上一行物品(×),但為什麼檢查的是上一列的物品,因為要檢視是否能加入上一列物品

# w[i-1]就是代表第n行物品

# res[i - 1][j - w[i - 1]] + p[i - 1]用來計算加入當前物品後,剩餘容量能否再加入物品,加入後是否超過當前價值

if(j >= w[i -1]

)and res[i -1]

[j - w[i -1]

]+ p[i -1]

> res[i]

[j]:

res[i]

[j]= res[i -1]

[j - w[i -1]

]+ p[i -1]

return res

# 在相同價值情況下,後一件物品比前一件物品的最大價值大,則表示物品i有被加入到揹包

defshow

(n, c, w, res)

:print

('最大價值為:'

, res[n]

[c])

# 最大的價值在矩陣的最後乙個元素

# 展示選擇物品方案1

# j=c

# print('選擇的物品為:')

# for i in range(1,len(res)):

# # 遍歷res每i行,第j列元素

# if res[i][j]>res[i-1][j]:

# print('第', i, '個',end=' ')

# j-=w[i-1] # 重點

# 展示選擇物品方案2

x =[false

for i in

range

(n)]

# 預設所有物品沒有選擇

j = c # j儲存最大容量

for i in

range(1

, n +1)

:if res[i]

[j]> res[i -1]

[j]:

x[i -1]

=true

#res陣列和x陣列相差1個位置

j -= w[i -1]

print

('選擇的物品為:'

)for i in

range

(n):

if x[i]

:print

('第'

, i+1,

'個',end=

動態規劃之揹包問題 python實現

大揹包問題(01揹包)

大揹包問題 有n乙個重量和 值分別w i 和v i 專案。出的這些產品中的總重量不超過w專案。查詢所有選定的方案 值的最大總和值。其中,1 n 40,1 w i v i 10 15,1 w 10 15.這個問題給人的第一感覺就是普通的01揹包。只是,看完資料範圍會發現。這次價值和重量都能夠是很大的數...

01揹包問題 大揹包

i i 物體索引 0 n j jj 揹包容量 0 w dpdp dp 最大價值 為了降低時間複雜度我們必須要改變dp陣列含義為。由於時間複雜度主要由i ii和j jj的含義決定,所以我們必須將i ii和j jj的含義於取值返回比較小的n nn和v vv陣列聯絡起來,將較大的w ww與dpdp dp陣...

01揹包第k大

嗯 這道題其實還是挺簡單的 然後我就不會做了qaq 實際上就是設 f i j k 為第i個物品,容量為j,第k個揹包的價值。那麼則有f i j p f i 1 j w i 1 k val i 與f i 1 j 1 k 的第p個 然後因為我懶了一下 我想 誒?詢問最大值?前k大?然後搞了個堆下來 然後...