Python基于贪心算法解决背包问题示例


Posted in Python onNovember 27, 2017

本文实例讲述了Python基于贪心算法解决背包问题。分享给大家供大家参考,具体如下:

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

完全背包问题:给定n个物品和一个容量为C的背包,物品i的重量是Wi,其价值为Vi,背包问题是如何选择入背包的物品,使得装入背包的物品的总价值最大,与0-1背包的区别是,在完全背包问题中,可以将物品的一部分装入背包,但不能重复装入。

设计算法的思路很简单,计算物品的单位价值,然后尽可能多的将单位重量价值高的物品放入背包中。

python实现代码如下:

# coding=gbk
# 完全背包问题,贪心算法
import time
__author__ = 'ice'
class goods:
  def __init__(self, goods_id, weight=0, value=0):
    self.id = goods_id
    self.weight = weight
    self.value = value
# 不适用于0-1背包
def knapsack(capacity=0, goods_set=[]):
  # 按单位价值量排序
  goods_set.sort(key=lambda obj: obj.value / obj.weight, reverse=True)
  result = []
  for a_goods in goods_set:
    if capacity < a_goods.weight:
      break
    result.append(a_goods)
    capacity -= a_goods.weight
  if len(result) < len(goods_set) and capacity != 0:
    result.append(goods(a_goods.id, capacity, a_goods.value * capacity / a_goods.weight))
  return result
some_goods = [goods(0, 2, 4), goods(1, 8, 6), goods(2, 5, 3), goods(3, 2, 8), goods(4, 1, 2)]
start_time = time.clock()
res = knapsack(6, some_goods)
end_time = time.clock()
print('花费时间:' + str(end_time - start_time))
for obj in res:
  print('物品编号:' + str(obj.id) + ' ,放入重量:' + str(obj.weight) + ',放入的价值:' + str(obj.value), end=',')
  print('单位价值量为:' + str(obj.value / obj.weight))
# 花费时间:2.2807240614677942e-05
# 物品编号:3 ,放入重量:2,放入的价值:8,单位价值量为:4.0
# 物品编号:0 ,放入重量:2,放入的价值:4,单位价值量为:2.0
# 物品编号:4 ,放入重量:1,放入的价值:2,单位价值量为:2.0
# 物品编号:1 ,放入重量:1,放入的价值:0.75,单位价值量为:0.75

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python  连接字符串(join %)
Sep 06 Python
python实现计算倒数的方法
Jul 11 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
Windows下python2.7.8安装图文教程
May 26 Python
python图像常规操作
Nov 11 Python
Python实现自动上京东抢手机
Feb 06 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
Python如何实现远程方法调用
Aug 07 Python
Python标准模块--ContextManager上下文管理器的具体用法
Nov 27 #Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 #Python
深入理解Python中range和xrange的区别
Nov 26 #Python
PyCharm在win10的64位系统安装实例
Nov 26 #Python
python shell根据ip获取主机名代码示例
Nov 25 #Python
python自动裁剪图像代码分享
Nov 25 #Python
分享一个简单的python读写文件脚本
Nov 25 #Python
You might like
利用“多说”制作留言板、评论系统
2015/07/14 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
JavaScript简介
2015/02/15 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
python list格式数据excel导出方法
2018/10/31 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
python计算导数并绘图的实例
2020/02/29 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
2015新员工工作总结范文
2015/10/15 职场文书