背包问题的实现代码

版权声明:本文为博主原创文章,未经博主允许可以转载。 https://blog.csdn.net/killeri/article/details/83304621

在说栈的时候说递归当然是因为递归和栈有关系,更具体的说是,递归的实现需要栈。
简要说明一下,每次递归到下一层,上一层的本分变量信息等都由一个栈存储,所以每一个底层递归的完成,就从栈顶取出原本保存在栈中的本层信息就可以实现计算,具体可以参考书本。

这里主要介绍的是背包问题,有关背包问题还可以参考百度背包问题,当然实现只是最简单的递归实现背包问题。

首先来描述一下背包问题,我这里的实现问题是:一个背包可以放进去weight重的东西,现在有一个集合,有n件物品,其中每件物品的重量是w1, w2, w3…wn。问能否从中选出若干件物品,使其重量刚好是weight。这是一个逻辑结果,但是我实现是返回的是物品的件数

# _*_ coding: utf-8 _*_

def Sum(arg):
    x= 0
    for i in arg:
        x = x + i
    return x
  # 一个计算元组和的函数


def pack(weight=0, x=0, i=0, arg = 0):
    if Sum(arg[:i]) == weight:
        return len(arg[:i])
        # 这是递归结束条件,指找到那几件物品
    i += 1
    if i > len(arg):
        i = 0
        x = x + 1
        # x表示递归开始的物品下标
        if x = len(arg):
        	raise ValueError("没有符合要求的物品组合")
        return pack(weight=70, x=x,i =1, arg=arg[x:])
        # 里面这层递归是从第二个物品向后加,用这个来实现
    return pack(weight=70, x = 0, i = i, arg = arg)
    # 外面这个递归调用是从第一个物品向后加

print(pack(weight = 70, x=0, i =1 ,arg = (20, 3, 5, 11,30,10,10, 20)))

说一下上面代码的思想:首先我们从第一个物品向后加,如果加到了几件物品的重量刚好是weight,那我们就可以直接返回结果;当我们从第一件物品向后加不能得到结果时,我们转换策略,从第二个物品向后加,如果加到几件物品的重量刚好是weight,那我们返回结果;依次类推,如果到了最后还是没有结果,我们就引发一个错误

猜你喜欢

转载自blog.csdn.net/killeri/article/details/83304621