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实现单线程多任务非阻塞TCP服务端
Jun 13 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
python构建深度神经网络(DNN)
Mar 10 Python
Python 文件数据读写的具体实现
Jan 24 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
python 画条形图(柱状图)实例
Apr 24 Python
如何理解Python中的变量
Jun 01 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 Python
Python如何让字典保持有序排列
Apr 29 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版 汉字转码的实现详解
2013/06/09 PHP
php实现水仙花数示例分享
2014/04/03 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
jQuery的强大选择器小结
2009/12/27 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
Python入门篇之列表和元组
2014/10/17 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
全面分析Python的优点和缺点
2018/02/07 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
好家长事迹材料
2014/01/23 职场文书
六查六看心得体会
2014/10/14 职场文书
大足石刻导游词
2015/02/02 职场文书
护士求职自荐信范文
2015/03/04 职场文书
导游词之千岛湖
2019/09/23 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android