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使用reportlab实现图片转换成pdf的方法
May 22 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
Python实现的简单dns查询功能示例
May 24 Python
简单了解python模块概念
Jan 11 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
推荐8款常用的Python GUI图形界面开发框架
Feb 23 Python
python IDLE添加行号显示教程
Apr 25 Python
利用python对excel中一列的时间数据更改格式操作
Jul 14 Python
PyCharm Community安装与配置的详细教程
Nov 24 Python
用Python实现Newton插值法
Apr 17 Python
python脚本框架webpy模板控制结构
Nov 20 Python
python解析照片拍摄时间进行图片整理
Jul 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
MYSQL环境变量设置方法
2007/01/15 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
php输出图像的方法实例分析
2017/02/16 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——VP
2018/04/04 DOTA
浅谈Python数据类型之间的转换
2016/06/08 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
Python中的asyncio代码详解
2019/06/10 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
建筑班组长岗位职责
2014/01/02 职场文书
小班下学期评语
2014/05/04 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
机器人瓦力观后感
2015/06/12 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python