# 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大?然後搞了個堆下來 然後...