今天做筆試的時候第一道題是揹包問題的變形,但是死活想不出來怎麼做,在此記錄一下三種揹包問題的思路和基本**:
問題描述:有n件物品和容量為m的揹包 給出i件物品的重量w[i]以及v[i]價值,,求解讓裝入揹包的物品重量不超過揹包容量,且價值最大 。
思路:i件物品,重量限制為j的最大價值設為f[i][j],該值取決於第i件物品放不放,不放是f[i-1][j],放是f[i-1][j-w[i]]+v[i],取這二者的最大值。
for i in
range(1
,n+1):
for j in
range(1
, m+1)
:if w[i]
<= j:
f[i]
[j]=
max(f[i-1]
[j], f[i-1]
[j-w[i]
]+v[i]
)else
: f[i]
[j]= f[i-1]
[j]
但這種方法需要初始化較大的二維陣列,資料較大時不適用,可以換用一維方法:
設f[j]表示重量不超過j的最大價值,f[j]=max(f[j], f[j−a[i]]+b[i])
for i in
range(1
,n+1):
for j in
range
(w[i]
,m+1):
f[j]
=max
(f[j]
, f[j-w[i]
]+v[i]
)
問題描述:有n件物品和容量為m的揹包 給出i件物品的重量以及價值,物品可以無限重複使用,求解讓裝入揹包的物品重量不超過揹包容量,且價值最大 。
思路:設每乙個物品取k個,再加一重迴圈嘗試k
for i in
range(1
,n+1
)for j in
range(1
,m+1
) f[i]
[j]=-1
k=0while k*w[i]
<=j:
f[i]
[j]=
max(f[i]
[j],f[i-1]
[j-k*w[i]
]+k*v[i]
) k+=
1
問題描述:有n種物品和乙個容量為m的揹包,第i種物品最多有c[i]件可用,價值為v[i],體積為w[i],求解,選哪些物品放入揹包,可以使得這些物品的價值最大,並且體積總和不超過揹包容量。
思路1:加乙個限制條件,k只能在相應物品的數量範圍內變化
思路2:將重複的物品拆開,相當於有(m+重複物品數)個物品,然後用[0,1]揹包方法求解。
for i in
range(1
,n+1
)for j in
range(1
,m+1
) f[i]
[j]=-1
k=0while k*w[i]
<=j and k: f[i]
[j]=
max(f[i]
[j],f[i-1]
[j-k*w[i]
]+k*v[i]
) k+=
1
python揹包問題 揹包問題Python
題目 揹包容量ba 物品thing v 問題 1.是否可以裝滿揹包2.裝滿揹包最少需要多少件物品3.裝滿揹包最多需要多少件物品4.該揹包最多一共可以裝多重的物品5.裝滿揹包一共有多少種方案 就算物品重量一樣,但也是不同的方案 一 01揹包 def bag 01 bag v,thing v 是否可以裝...
python 揹包問題
乙個小偷在某個商店發現有n個商品,第i個商品價值 v iv i vi 元,中w iw i wi 千克。他希望拿走的價值盡量高,但他的揹包最多只能容納w千克的東西。他應該拿走拿些商品?例如 商品1 v 1v 1 v1 60 w 1w 1 w1 10 商品2 v 2v 2 v2 100 w 2w 2 w...
python解決揹包 揹包變形問題
有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。例如 揹包的承重為10,現在有a,b,c,d,e五件物品,每件物品的重量分別為2,2,6,5,4,價值分別為6,3,5,4...