分支定界法 python_分支定界法求解背包问题的时间复杂度是多少

def bound(vw, v, w, idx):

if idx >= len(vw) or w > limit:

return -1

else:

while idx < len(vw) and w + vw[idx][1] <= limit:

v, w, idx = v+vw[idx][0], w+vw[idx][1], idx + 1

if idx < len(vw):

v += (limit - w)*vw[idx][0]/(vw[idx][1] * 1.0)

return v

def knapsack(vw, limit, curValue, curWeight, curIndex):

global maxValue

if bound(vw, curValue, curWeight, curIndex) >= maxValue:

if curWeight + vw[curIndex][1] <= limit:

maxValue = max(maxValue, curValue + vw[curIndex][0])

knapsack(vw, limit, curValue + vw[curIndex][0], curWeight + vw[curIndex][1], curIndex+1)

if curIndex < len(vw) - 1:

knapsack(vw, limit, curValue, curWeight, curIndex+1)

return maxValue

maxValue = 0

def test():

with open(sys.argv[1] if len(sys.argv) > 1 else sys.exit(1)) as f:

limit, n = map(int, f.readline().split())

vw = []

for ln in f.readlines():

vl, wl = map(int, ln.split())

vw.append([vl, wl, vl/(wl*1.0)])

knapsack(sorted(vw, key=lambda x: x[2], reverse=True), limit)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值