python基于递归解决背包问题详解


Posted in Python onJuly 03, 2019

递归是个好东西,任何具有递归性质的问题通过函数递归调用会变得很简单。一个很复杂的问题,几行代码就能搞定。

  最简单的递归问题:现有重量为weight的包,有若干重量分别为W1,W2.....Wn的物品,试问能否从物品中选出若干件而且重量刚好为weight?

  weight具体是怎么构成的,有下面两种情况(假设挑选到Wn时,刚好够weight):

  1. 从Wn-1开始就已经够weight,那weight=W1+W2+......+Wn=W1+W2+......+Wn-1.

  2.加上Wn后刚好够weight,那自然地有weight=W1+W2+......+Wn.

  上面两种情况一个有解,那问题就有解,于是我们可以把Wi从背包去掉倒退回去看weight的值。

  经过一系列倒推,weight的值有下面三种情况:

  1. weight刚刚等于0 //说明有解

  2. weight<0 //不可能,所以无解

  3. weight>0 and 没有W了 // 也不可能,无解

def knap(weight,weights,n): //weight为包的容量,weights是一个所有重量的表,n为重量数量
    if weight==0:
     return True;
    if weight<0 or (n<1 and weight>0):
     return False;
    if knap(weight-weights[n-1],weights,n-1): //情况 2
     print(weights[n-1])
     return True
    if knap(weight,weights,n-1): //情况 1
     return True
    else:
     return False

超级简单吧!!!如果采用动态规划解决,几十行代码要吧。这就12行代码,简单明了!!!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
Python求解任意闭区间的所有素数
Jun 10 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
Pyqt5自适应布局实例
Dec 13 Python
NumPy排序的实现
Jan 21 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 Python
python批量更改目录名/文件名的方法
Apr 18 Python
Python跳出多重循环的方法示例
Jul 03 #Python
Python多版本开发环境管理工具介绍
Jul 03 #Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 #Python
Python flask框架post接口调用示例
Jul 03 #Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 #Python
python调试神器PySnooper的使用
Jul 03 #Python
详解DeBug Python神级工具PySnooper
Jul 03 #Python
You might like
PHP初学者头疼问题总结
2006/07/08 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
Javascript MD4
2006/12/20 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
javascript的BOM汇总
2015/07/16 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python实现的双色球生成功能示例
2017/12/18 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
C++面试题目
2013/06/25 面试题
委托证明的格式
2014/01/10 职场文书
装饰活动策划方案
2014/02/11 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
甘南现象心得体会
2014/09/11 职场文书
详解MongoDB的条件查询和排序
2021/06/23 MongoDB