背包问题

1 篇文章 0 订阅
1 篇文章 0 订阅

背包问题

已知有n个物品组成的集合为S,每个物品的重量是 weighti w e i g h t i 。一个背包能装重量是weight的东西。问能从S中挑选出几件物品重量之和恰好为weight。如果存在就说这个背包问题有解,如果不存在该背包问题无解。

把背包问题写成符号的形式: bag(weight,n) b a g ( w e i g h t , n )
可以从最后一个物品来看看什么情况,当选择最后一个物品放入背包,此时问题变化为,当背包能装重量是 weightweightn w e i g h t − w e i g h t n ,有n-1个物品,从这n-1个物品中挑选出若干件物品其重量之和恰好是 weightweightn w e i g h t − w e i g h t n
bag(weightweightn,n1) b a g ( w e i g h t − w e i g h t n , n − 1 )
当不选择最后一个物品,但是如果能从n-1个物品中找到解,那么这个解也就是原问题的解。 bag(weight,n1) b a g ( w e i g h t , n − 1 )

本来是 bag(weight,n) b a g ( w e i g h t , n ) 问题可以化解为 bag(weight,n1)orbag(weightweightn,n1) b a g ( w e i g h t , n − 1 ) o r b a g ( w e i g h t − w e i g h t n , n − 1 ) 可以逐步进行递归。

def bag(weight,wlist,n):
#结束条件
    if weight==0:
        return True
    if weight<0 or (weight>0 and n<1):
        return False
    #没有考虑把最后一个物品放入bag
    if bag(weight,wlist,n-1):
        return True
    if bag(weight-wlist[n-1],wlist,n-1):
        print("Item"+str(n)+":"+wlist[n-1])
        return True
    else:return False

函数中涉及到了两个递归函数,最终一层层的调用,每层的函数帧会形成一个类似一个二叉树的形式{如果使用栈来代替递归}。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值