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之玩转字符串(3)
Sep 14 Python
python使用in操作符时元组和数组的区别分析
May 19 Python
Python实现堆排序的方法详解
May 03 Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 Python
用pickle存储Python的原生对象方法
Apr 28 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
python反扒机制的5种解决方法
Feb 06 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之第二天
2006/10/09 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
thinkphp中的url跳转用法分析
2016/07/12 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
Python中的类与对象之描述符详解
2015/03/27 Python
python实现字符串加密成纯数字
2019/03/19 Python
python画图的函数用法以及技巧
2019/06/28 Python
Python Django view 两种return的实现方式
2020/03/16 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
python代码中怎么换行
2020/06/17 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
社团文化节邀请函
2014/01/10 职场文书
创业计划书模版
2014/02/05 职场文书
《锄禾》教学反思
2014/04/08 职场文书
Java实现注册登录跳转
2022/06/16 Java/Android
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis