0-1背包问题(DP)

[题目描述]:

    一个背包里面可以存放重量为weight的物品,现有n件物品的集合s,其中质量为w0,w1,......wn-1,问是否可以选出若干物品,其重量之和正好等于weight。

[题目分析]

背包问题属于动态规划(DP)的一类,背包问题有很多,比如0-1背包,多重背包,完全背包等,其中在面试和考试中被问到最多的就是0-1背包问题,动态规划问题的关键就是找出转移方程,它有点类似于我们数学中的递推式。
0-1背包类的问题大体有两种考察方法,一种模型是给定一个容积为V的背包和n个物品,每个物品具有固定的体积,问是否可以找出一组物品正好可以把这个背包填满。另外一种模型同样是给定一个容积为V的背包,不同的是除了给定每个物品的体积之外,还告诉每个物品的价值,问如何才能在不超过背包的容积V的情况下,使得装入背包的物品价值最大。本题属于第一种类型。
下面这个图概括了整个0-1背包问题求解的思考过程:

Talk is cheap, i will show my code,(一切空谈算法不给出代码的行为都是耍流氓)

[python代码实现】

# __*__ coding: utf-8 __*__
#  Author : linenwei
#  Contact: 1354312240@qq.com
#  blog: http://blog.youkuaiyun.com/kobebryantlin0
def is_full(weight,s,lenth):
    """weight代表背包的体积,s集合存放每件物品的质量,
       lenth是集合中物品的数量"""
    if weight ==0:
        # weight =0 表示上一层的调用中weight经过多层
        自减之后与列表中的某一个物品的重量相等
        # 此时说明找到了这组物品,倒序打印出整个堆栈中与weight
        做过减法的物品即可。
        return True
    elif weight < 0 or lenth < 0:
        return False
    elif is_full(weight-s[lenth],s,lenth-1):
        #判断前n-1个物品中,是否可以找出一组物品之和
        等于weight减去第n个物品的重量
        print("item:%d" % s[lenth])
        return True
    elif is_full(weight,s,lenth-1):
        #判断前n-1个物品中是否可以找出一组物品之和等于weight
        return  True

weight = 100
s=[1,2,3,4,5,6,7,8,9]
flag = is_full(weight,s,len(s)-1)
if not flag:
    print("找不到")


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值