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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值