窮舉法解決0/1揹包問題——python

皮卡丘^O^-喬旭發表於2020-12-02

“”“使用窮舉法解決0/1揹包問題。問題描述:給定n個重量為{w1, w2, … ,wn}、價值為{v1, v2, … ,vn}的物品和一個容量為C的揹包,求這些物品中的一個最有價值的子集,且要能夠裝到揹包中。”""

weight = []  # 重量
value = []    # 價值
choose = []  # 選擇方式
B = []   # 把每個物品的選擇轉化為整數並分別列出
C = []  # 最大價格所選擇的方法
D = []   # 把每種選擇轉化為一個列表組成一個新的選擇列表
vmax = 0   # 最大價值
W = 0   # 這個選擇的重量
V = 0   # 這個選擇的價值
t = int(input("請輸入問題規模:"))
M = int(input("請輸入揹包的最大承重量:"))

# 輸入

for cishu in range(t):
    weight.append(int(input("請輸入第%d個物品的重量" % cishu)))  
    value.append(int(input("請輸入第%d個物品的價格" % cishu)))

# 將選擇轉化為二進位制

for xuanze in range(pow(2, t)):
	choose.append('{0:05b}'.format(xuanze))

# print(weight)

# print(value)

# print(choose)

u = 1  # 列表的第幾個元素
while u < int(pow(2, t)):   

# 把這個選擇劃分到每個物品  for s in choose[u]:    
​    	s = int(s)  
​        B.append(s)   
​    B.reverse()  
​    D.append(B)   
   	u += 1   
   	B = []

# print(D)

f = 0
while f < (pow(2, t)-1):    
	i = 0  
 	while i < t:
	W += D[f][i] * weight[i]
	V += D[f][i] * value[i]
	i += 1   
	f = f + 1 
 	if W <= M:     
		if V > vmax:     
			vmax = V     
     		C.clear()
          	C.append(D[f-1])   
           	W = 0     
         	V = 0    
     	elif V == vmax:    
       		C.append(D[f-1])    
        	W = 0     
       		V = 0   
		else:     
      		W = 0      
          	V = 0    
 	else: 
		 W = 0    
  		 V = 0
C = str(C)
print("最大價值是%d" % vmax)
print("對應的取法是:"+C)
print("""其中’1‘是取對應位置的物品,’0‘為不取;一個[]為一種取法\n
		這個是為規模為5所設定的,若規模小於5,規模是幾看前幾位,\n  
		若大於五則需更改程式碼第18行5為此時規模\n""")

相關文章