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 = A
list[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 = A
G[i,j]= k
list[i,j]= result
returnlist[N,V],G
然后逆向搜索解空间得到PATH
defdecode_G(G,N,V,W,C):
i = N
v = V
while 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 = N
v = V
while 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]= i
else:
track_solution[i,v]= track_solution[i-1,v]returnlist[V],track_solution
deftrack_solution_standard(G,N,V,W,C):
i = N
v = V
while G[i,v]!=0:
i = G[i,v]
m =0while G[i,v]== i:# 在v的方向上搜索
m +=1
v -=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
混合背包问题通用处理如下,我们以通用状态方式处理解空间的追踪:def pack_01_and_complete_and_multiple_Bottom_up(N,V,C,W,M): list = np.zeros((N+1,V+1),dtype=int) for i in range(1,N+1): for j in range(0,V+1): ...