背包问题追踪解

混合背包问题通用处理如下,我们以通用状态方式处理解空间的追踪:

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):
            t = min(j // C[i-1],M[i-1])
            result = -1000
            for k in range(t+1):
                A = list[i-1,j-k*C[i-1]] + k*W[i-1]
                if A > result:
                    result = A
            list[i,j] = result         
     
    return list[N,V]

我们用G[i][v]来追踪解,这里面记录的是在i,v状态下取了多少件i物品

def pack_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 in range(1,N+1):
        for j in range(0,V+1):
            t = min(j // C[i-1],M[i-1])
            result = -1000
            for k in range(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         
     
    return list[N,V] ,G

然后逆向搜索解空间得到PATH

def decode_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

猜你喜欢

转载自blog.csdn.net/weixin_40759186/article/details/84189457