defpack_01_and_complete_and_multiple_Bottom_up(N,V,C,W,M):list= np.zeros((N+1,V+1),dtype=int)for i inrange(1,N+1):for j inrange(0,V+1):t =min(j // C[i-1],M[i-1])result =-1000for k inrange(t+1):A =list[i-1,j-k*C[i-1]]+ k*W[i-1]if A > result:result = Alist[i,j]= result returnlist[N,V]
我們用G[i][v]來追蹤解,這里面記錄的是在i,v狀態下取了多少件i物品
defpack_01_and_complete_and_multiple_Bottom_up(N,V,C,W,M):list= np.zeros((N+1,V+1),dtype=int)G = np.zeros((N+1,V+1),dtype=int)for i inrange(1,N+1):for j inrange(0,V+1):t =min(j // C[i-1],M[i-1])result =-1000for k inrange(t+1):A =list[i-1,j-k*C[i-1]]+ k*W[i-1]if A > result:result = AG[i,j]= klist[i,j]= result returnlist[N,V],G
然后逆向搜索解空間得到PATH
defdecode_G(G,N,V,W,C):i = Nv = Vwhile i >0:print("Choose value {} : cost {}: how many {}".format(W[i-1],C[i-1],G[i,v]))v -= G[i,v]*C[i-1]i -=1
運行結果:
python
N =8
V =20
C =[11,2,3,9,13,6,7,5]
W =[1,2,5,7,5,11,6,14]
M =[10,2,9,1,19,3,4,1]value,path = pack_01_and_complete_and_multiple_Bottom_up(N,V,C,W,M)print value
decode_G(path,N,V,W,C)41
Choose value 14: cost 5: how many 1
Choose value 6: cost 7: how many 0
Choose value 11: cost 6: how many 2
Choose value 5: cost 13: how many 0
Choose value 7: cost 9: how many 0
Choose value 5: cost 3: how many 1
Choose value 2: cost 2: how many 0
Choose value 1: cost 11: how many 0
選與不選,就是01問題的追蹤:
import numpy as np
defpack_01_track_solution_Bottom_up(N,V,C,W):track_solution = np.zeros((N+1,V+1),dtype =int)list=[0]*(V+1)for i inrange(1,N+1):for v inrange(V,C[i-1]-1,-1):iflist[v]<list[v-C[i-1]]+ W[i-1]:list[v]=list[v-C[i-1]]+ W[i-1]track_solution[i,v]=1# else:# track_solution[i,v] = 0 returnlist[V],track_solution
deftrack_solution(G,N,V,W,C):i = Nv = Vwhile i >0:print("Choose value {} : cost {}: how many {}".format(W[i-1],C[i-1],G[i,v]))v -= G[i,v]*C[i-1]i -=1
無限數量,完全背包問題,標記函數:
defpack_complete_track_solution_Bottom_up(N,V,C,W):track_solution = np.zeros((N+1,V+1),dtype =int)track_solution[1:,1:]=-1list=[0]*(V+1)for i inrange(1,N+1):for v inrange(C[i-1],V+1):iflist[v]<=list[v-C[i-1]]+ W[i-1]:list[v]=list[v-C[i-1]]+ W[i-1]track_solution[i,v]= ielse:track_solution[i,v]= track_solution[i-1,v]returnlist[V],track_solution
deftrack_solution_standard(G,N,V,W,C):i = Nv = Vwhile G[i,v]!=0: i = G[i,v]m =0while G[i,v]== i:# 在v的方向上搜索m +=1v -=C[i-1]print("Choose value {} : cost {}: how many {}".format(W[i-1],C[i-1],m))while G[i,v]==-1:# 在i的方向上搜索i -=1#%%
N =8
V =30
C =[11,2,3,9,13,6,15,7,19]
W =[1,2,5,7,5,11,6,14]
value,path = pack_complete_track_solution_Bottom_up(N,V,C,W)print value
print path
track_solution_standard(path,N,V,W,C)58[[0000000000000000000000000000000][0-1-1-1-1-1-1-1-1-1-111111111111111111111][0-122222222222222222222222222222][0-1-13333333333333333333333333333][0-1-1-1-1-1-1-1-13333333333333333333333][0-1-1-1-1-1-1-1-1-1-1-1-1333333333333333333][0-1-1-1-1-16666666666666666666666666][0-1-1-1-1-1-1-1-1-1-1-1-1-1-16666666666666666][0-1-1-1-1-1-188888-1888888888888888888]]8
Choose value 14: cost 7: how many 42
Choose value 2: cost 2: how many 1