关于递归的一个例子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))))
'''
输出的数据排序是和输入的数组有关系,如果想统一可以自行对数组数据进行排序,再调用函数。
'''