0_1_2揹包问题动态规划方法求解python代码

0_1_2揹包问题动态规划方法求解python代码

0_1揹包递推公式

在这里插入图片描述
0_1_2揹包问题则为,可对一件物品放1个或者2个,0为不放。设计算法时比0_1揹包问题多加一个限制条件

def ZeroOneTwoBag(n, W, V, C):
    C = int(C)  # 容量C
    n = int(n)  # 物品个数
    w = W.split(',')
    w = [int(i) for i in w]  # 物品重量数组
    v = V.split(',')
    v = [int(i) for i in v]  # 物品价值数组
    bagTable = [[0 for j in range(C + 1)] for i in range(n + 1)]
    for key_n in range(1,len(bagTable)):
        for key_c in range(1,len(bagTable[key_n])):
            #当前商品重量大于当前揹包重量
            if w[key_n-1] > key_c:
                bagTable[key_n][key_c] = bagTable[key_n-1][key_c]
            #如果当前揹包容量小于两倍物品重量大于一倍物品重量
            elif w[key_n-1] <= key_c < 2*w[key_n-1]:
                # 如果放揹包里,等于只放key_n-1个物品时,并且揹包容量为key_c-W[key_n]时的价值加上当前的物品价值
                value1 = bagTable[key_n - 1][key_c - w[key_n - 1]] + v[key_n - 1]
                # 如果不放在揹包里
                value2 = bagTable[key_n - 1][key_c]
                bagTable[key_n][key_c] = max(value1, value2)
            else:
                # 如果放揹包里,等于只放key_n-1个物品时,并且揹包容量为key_c-W[key_n]时的价值加上当前的物品价值
                value1 = bagTable[key_n - 1][key_c - w[key_n - 1]] + v[key_n - 1]
                # 如果不放在揹包里
                value2 = bagTable[key_n - 1][key_c]
                #如果放两个在揹包里
                value3 = bagTable[key_n - 1][key_c - 2*w[key_n - 1]] + 2*v[key_n - 1]
                bagTable[key_n][key_c] = max(value1, value2,value3)

    for i in range(len(bagTable)):
        print(bagTable[i])
    return bagTable


if __name__ == '__main__':
    inputlist = str(input()).split('-')
    n = inputlist[0]
    W = inputlist[1]
    V = inputlist[2]
    C = inputlist[3]
    ZeroOneTwoBag(n, W, V, C)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章