題目:揹包容量ba**,物品thing_v
問題:1.是否可以裝滿揹包2.裝滿揹包最少需要多少件物品3.裝滿揹包最多需要多少件物品4.該揹包最多一共可以裝多重的物品5.裝滿揹包一共有多少種方案[就算物品重量一樣,但也是不同的方案]
一、01揹包
def bag_01(bag_v,thing_v):
#是否可以裝滿的揹包問題,裝滿這個揹包最少需要多少件物品 最多需要多少件物品 盡可能把揹包裝滿的最大重量 裝滿有多少種方案 五大問題
#這裡的物品只有取和不取,bag_v揹包的體積 thing_v物品各自的體積
fullbagbool = [false] * (bag_v + 1);fullbagbool[0] = true#當使用第0件物品時,可以填滿容積為0的包,兒其他容積則無法填滿。
minnum = [float('inf')] * (bag_v + 1);minnum[0] = 0#當使用第0件物品時,可以填滿容積為0的包,至少為 0件兒其他容積則無法填滿。
maxnum = [-float('inf')] * (bag_v + 1);maxnum[0] = 0#當使用第0件物品時,可以填滿容積為0的包,至多為0件,其它無法填滿
maxweight = [0] * (bag_v + 1)#使用第0件物品時,最大裝的只是0
plannum = [0] * (bag_v + 1);plannum[0] = 1#使用第0件物品裝滿其它容積這是不存在的事情,所以是0個方案
for i in range(1,len(thing_v) + 1):
for j in range(bag_v,thing_v[i - 1] - 1,-1):
fullbagbool[j] |= fullbagbool[j - thing_v[i - 1]]
if thing_v[i - 1] <= j:
minnum[j] = min(minnum[j],minnum[j - thing_v[i - 1]] + 1)
maxnum[j] = max(maxnum[j],maxnum[j - thing_v[i - 1]] + 1)
maxweight[j] = max(maxweight[j],maxweight[j - thing_v[i - 1]] + thing_v[i - 1])
plannum[j] += plannum[j - thing_v[i - 1]]
return fullbagbool,minnum,maxnum,maxweight,plannum
二、完全揹包
def bag_wanquan(bag_v,thing_v):
# 是否可以裝滿的揹包問題,裝滿這個揹包最少需要多少件物品 最多需要多少件物品 盡可能把揹包裝滿的最大重量 裝滿有多少種方案 五大問題
# 這裡的物品可以取無限件,bag_v揹包的體積 thing_v物品各自的體積
fullbagbool = [false] * (bag_v + 1);fullbagbool[0] = true
minnum = [float('inf')] * (bag_v + 1);minnum[0] = 0
maxnum = [-float('inf')] * (bag_v + 1);maxnum[0] = 0
maxweight = [0] * (bag_v + 1)
plannum = [0] * (bag_v + 1);plannum[0] = 1
for i in range(1,len(thing_v) + 1):
for j in range(thing_v[i - 1],bag_v + 1):
fullbagbool[j] |= fullbagbool[j - thing_v[i - 1]]
if thing_v[i - 1] <= j:
minnum[j] = min(minnum[j],minnum[j - thing_v[i - 1]] + 1)
maxnum[j] = max(maxnum[j],maxnum[j - thing_v[i - 1]] + 1)
maxweight[j] = max(maxweight[j],maxweight[j - thing_v[i - 1]] + thing_v[i - 1])
plannum[j] += plannum[j - thing_v[i - 1]]
return fullbagbool,minnum,maxnum,maxweight,plannum
三、結果
if __name__ == '__main__':
bag_v = 6;
thing_v = [2,2,4]
a,b,c,d,e = bag_01(bag_v,thing_v)
print('簡單01揹包,每個物品只有一件'.center(100,'*'))
print('是否可以裝滿揹包:', a)
print('裝滿揹包最少需要物品的數量:', b)
print('裝滿揹包最多需要物品的數量:', c)
print('揹包最多可以裝多重:', d)
print('裝滿揹包的方案數:', e)
print('簡單01揹包,每個物品只有一件'.center(100, '*'))
a,b,c,d,e = bag_wanquan(bag_v,thing_v)
print('簡單01揹包,每個物品不限量'.center(100,'*'))
print('是否可以裝滿揹包:', a)
print('裝滿揹包最少需要物品的數量:', b)
print('裝滿揹包最多需要物品的數量:', c)
print('揹包最多可以裝多重:', d)
print('裝滿揹包的方案數:', e)
print('簡單01揹包,每個物品不限量'.center(100, '*'))
output:
******************************************簡單01揹包,每個物品只有一件*******************************************
是否可以裝滿揹包: [true, false, true, false, true, false, true]
裝滿揹包最少需要物品的數量: [0, inf, 1, inf, 1, inf, 2]
裝滿揹包最多需要物品的數量: [0, -inf, 1, -inf, 2, -inf, 2]
揹包最多可以裝多重: [0, 0, 2, 2, 4, 4, 6]
裝滿揹包的方案數: [1, 0, 2, 0, 2, 0, 2]
******************************************簡單01揹包,每個物品只有一件*******************************************
*******************************************簡單01揹包,每個物品不限量*******************************************
是否可以裝滿揹包: [true, false, true, false, true, false, true]
裝滿揹包最少需要物品的數量: [0, inf, 1, inf, 1, inf, 2]
裝滿揹包最多需要物品的數量: [0, -inf, 1, -inf, 2, -inf, 3]
揹包最多可以裝多重: [0, 0, 2, 2, 4, 4, 6]
裝滿揹包的方案數: [1, 0, 2, 0, 4, 0, 6]
*******************************************簡單01揹包,每個物品不限量*******************************************
揹包問題 01揹包問題
n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...
01揹包問題 完全揹包問題 多重揹包問題
0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...
01揹包問題 完全揹包問題 多重揹包問題
有n件物品和乙個容量為v 的揹包。放入第i件物品耗費的空間是ci,得到 的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不 放。用子問題定義狀態 即f i,v 表示前i件物品恰放入乙個容量為v的揹包可以 獲得的最大價值。則其狀態轉移方...