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)  # 输出最大价值装入的物品

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值