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 相关文章推荐
Python3中使用PyMongo的方法详解
Jul 28 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
python lxml中etree的简单应用
May 10 Python
Django自定义用户登录认证示例代码
Jun 30 Python
Python Django的安装配置教程图文详解
Jul 17 Python
django 类视图的使用方法详解
Jul 24 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 23 Python
Python while true实现爬虫定时任务
Jun 08 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 Python
解决python存数据库速度太慢的问题
Apr 23 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
一个基于PDO的数据库操作类
2011/03/24 PHP
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
python fabric实现远程操作和部署示例
2014/03/25 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
Python中字符串List按照长度排序
2019/07/01 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
副厂长岗位职责
2014/02/02 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
2014年小学工作总结
2014/11/26 职场文书
结婚堵门保证书
2015/05/08 职场文书
浅谈Python数学建模之线性规划
2021/06/23 Python