python揹包問題 揹包問題Python

2021-10-11 05:11:19 字數 3795 閱讀 6409

題目:揹包容量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的揹包可以 獲得的最大價值。則其狀態轉移方...