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去掉字符串中重复字符的方法
Feb 27 Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
Python 装饰器深入理解
Mar 16 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
Python3.5.3下配置opencv3.2.0的操作方法
Apr 02 Python
使用Python在Windows下获取USB PID&amp;VID的方法
Jul 02 Python
解决python 上传图片限制格式问题
Oct 30 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
Python中super().__init__()测试以及理解
Dec 06 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的优点与缺点
2013/04/11 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
JQUERY获取form表单值的代码
2010/07/17 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python 变量类型及命名规则介绍
2013/06/08 Python
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
python字典基本操作实例分析
2015/07/11 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
python中的计时器timeit的使用方法
2017/10/20 Python
python编程嵌套函数实例代码
2018/02/11 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
Python ORM编程基础示例
2020/02/02 Python
python中实现栈的三种方法
2020/12/19 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
学校元旦晚会方案
2014/02/19 职场文书
工作建议书范文
2019/07/08 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS