Python 01背包问题——用动态规划、回溯解决

01背包问题 Python

这个问题看到大多数是C++解决的,思想相同,代码大同小异
所以把Python的代码写下来了

1、动态规划

Python实现代码

##动态规划解决01背包问题
##递归

things=['a','b','c','d','e']
value=[6,3,5,4,6]
weight=[2,2,6,5,4]

def backpack(n,w):##从n件物品中选,背包可用价值空间为w
    if (n==0) or (w==0):##物品没有了,或背包可用价值没有了,直接停止
        return 0
    if w<weight[5-n]:##如果背包可用价值比物品的价值小,则直接不放入
        ret=backpack(n-1,w)##不放入
        return ret
    val1=backpack(n-1,w-weight[5-n])+value[5-n]##放入背包
    val2=backpack(n-1,w)##不放入

    ##ret存放最大价值
    if val1>=val2:
        ret=val1
    else:
        ret=val2
    return ret

if __name__ =='__main__':
    ret=backpack(5,10)
    print("最大价值:"+str(ret))

2.回溯

Python实现代码

##回溯算法解决01背包问题

bestV = 0  # 装入的价值
curW = 0  # 当前放入背包的物品重量
curV = 0  # 当前放入背包的物品价值
bestx = None  # 标记装入的物品,置为ture

def backtrack(i):
    global bestV, curW, curV, x, bestx  # global 修改外部变量的值
    if i >= n:  # 递归结束
        if bestV < curV:  # bestV赋值为最大价值
            bestV = curV
            bestx = x[:] #给bestx赋值
    else:
        # 两种情况,该物品放入、不放入
        if curW + w[i] <= c:  # 放入物品
            x[i] = True
            curW = curW + w[i]
            curV = curV + v[i]
            backtrack(i + 1)
            curW = curW - w[i]  # 不放入
            curV = curV - v[i]
        x[i] = False  # 不放入物品
        backtrack(i + 1)

if __name__ == '__main__':
    n = 5  # 物品数量
    c = 10  # 背包容量
    w = [2, 2, 6, 5, 4]  # 物品重量
    v = [6, 3, 5, 4, 6]  # 物品价值
    x = [False for i in range(n)]  # 初始化x
    # print(x)
    backtrack(0)
    print("最大价值:" + str(bestV))
    #print(bestV)  # 输出最大价值
    #print(bestx)  # 输出最大价值装入的物品

你可能感兴趣的:(算法,动态规划,python,贪心算法)