揹包問題 python

2021-10-04 10:19:34 字數 1864 閱讀 8958

今天做筆試的時候第一道題是揹包問題的變形,但是死活想不出來怎麼做,在此記錄一下三種揹包問題的思路和基本**:

問題描述:有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...