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之用while来循环
Oct 02 Python
在windows系统中实现python3安装lxml
Mar 23 Python
Python如何为图片添加水印
Nov 25 Python
利用python循环创建多个文件的方法
Oct 25 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
python日期相关操作实例小结
Jun 24 Python
Python之修改图片像素值的方法
Jul 03 Python
TensorFLow 变量命名空间实例
Feb 11 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
Mar 11 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 10 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
PHP 反向排序和随机排序代码
2010/06/30 PHP
php生成动态验证码gif图片
2015/10/19 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
Javascript访问器属性实例分析
2014/12/30 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
使用Python的判断语句模拟三目运算
2015/04/24 Python
python批量提取word内信息
2015/08/09 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python输出决策树图形的例子
2019/08/09 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
Python之多进程与多线程的使用
2021/02/23 Python
存储过程的优缺点是什么
2015/01/10 面试题
程序员岗位职责
2013/11/11 职场文书
写给爸爸的道歉信
2014/01/15 职场文书
活动志愿者自荐信
2014/01/27 职场文书
应届生求职信
2014/05/31 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL