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 元类使用说明
Dec 18 Python
python读写ini文件示例(python读写文件)
Mar 25 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
深入浅析Python中的yield关键字
Jan 24 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
Python函数中的可变长参数详解
Sep 12 Python
python3 webp转gif格式的实现示例
Dec 10 Python
Python实例方法、类方法、静态方法区别详解
Sep 05 Python
Python修改DBF文件指定列
Dec 19 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
PHP session会话的安全性分析
2011/09/08 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
详谈javascript异步编程
2016/02/21 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
Python 合并拼接字符串的方法
2020/07/28 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
办理信用卡工作证明
2014/09/30 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
virtualenv隔离Python环境的问题解析
2022/06/21 Python