欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于递归的一个例子2 简单的背包问题

程序员文章站 2022-05-28 13:06:51
...

关于递归的一个例子2 简单背包问题

题目

一个背包里可放入重量为weight的物品,现有n件物品的集合S,其中物品的重量分别为w0,w1,···,wn-1。问题是能否从中选出若干件物品,其重量之和正好等于weight。如果存在就说明这一背包有解,否则就是无解。

输入格式

在一行中输入weight,物件最大数量n,物品集合S(是一个数组,Python中是列表)

输出格式

具体的实现方式(采用贪心算法,仅求一个解法即可)和对与错。

输入样例

30 7 list(range(20,0,-1))

输出样例

9 6 5 4 3 2 1 True 

思路

题目给定背包,物件个数,物件质量。
先取出列表中的第一个,判断它是否能达成所需要的效果。若不能达成条件,则返回错误,能达成条件则返回正确。这里用递归实现。
所以判断达成条件的方式是定义一些出口。

代码如下

def bags(weight,n,S):
    if weight == 0: # 判断达成的条件
        return True
    elif weight < 0: # 跳出函数的条件,超重,出口1
        return False
    elif n <= 0: # 跳出函数的条件,最大个数被取完,出口2
        return False
    elif len(S)<= 0: # 列表被取完,出口3
        return False
    tw = S.pop() # 取出第一个数
    a = S[:] # 记录列表(易错点)
    if bags(weight-tw,n-1,S): # 递归调用
        print(tw,end = ' ')
        return True
    elif bags(weight,n,a): # 递归调用
        return True
    return False
print(bags(30,7,list(range(20,0,-1))))
'''
输出的数据排序是和输入的数组有关系,如果想统一可以自行对数组数据进行排序,再调用函数。
'''