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