0-1背包问题(DP)
来源:互联网 发布:王鹏博士 杨浦云计算 编辑:程序博客网 时间:2024/06/05 11:47
[题目描述]:
一个背包里面可以存放重量为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.csdn.net/kobebryantlin0def 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 Trueweight = 100s=[1,2,3,4,5,6,7,8,9]flag = is_full(weight,s,len(s)-1)if not flag: print("找不到")
阅读全文
0 0
- 0-1背包问题 | DP
- 0/1 背包 dp问题
- DP 0-1背包问题
- 0-1背包问题(DP)
- 简单背包问题+0/1背包问题+DP
- 0—1背包问题(dp)
- 入门经典 DP 0-1背包问题
- 0-1背包(DP经典问题)
- 0-1背包 (DP)
- DP 背包问题 01背包
- DP入门, 0-1背包问题(HDOJ 2602类似)
- 0-1背包问题(C++ && 详解)DP
- poj 3624 Charm Bracelet DP 0/1 背包问题
- UVa 624 - CD DP 0/1 背包问题
- 算法导论-----------------0-1背包问题dp求解
- Tyvj P1005 采药 - DP 0/1背包问题
- 0-1背包问题(电子科大饭卡)dp
- 洛谷P1049 装箱问题(DP, 0-1背包)
- Maven学习笔记之配置文件(settings.xml)
- java基础之位运算符
- MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什么特点?
- RelativeLayout相对布局
- linux驱动程序设计
- 0-1背包问题(DP)
- 工作十年
- JAVA并发编程: CAS和AQS
- ZTE U880 使能Adb for Linux
- 增强自信心的十大经典法则
- 独立安装以及配置免安装版apache
- 死锁
- 介绍一个python的开源项目,有兴趣可以看看
- Hibernate入门10_二级缓存01_类级别