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调度框架APScheduler使用
Mar 28 Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 Python
Python实现朴素贝叶斯分类器的方法详解
Jul 04 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
Python Pillow Image Invert
Jan 22 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
python基础梳理(一)(推荐)
Apr 06 Python
python 自动轨迹绘制的实例代码
Jul 05 Python
wxPython实现列表增删改查功能
Nov 19 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
Jan 09 Python
Python迭代器Iterable判断方法解析
Mar 16 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
jQuery链使用指南
2015/01/20 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
js+css实现回到顶部按钮(back to top)
2016/03/02 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
2020/04/27 Javascript
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
《再别康桥》教学反思
2014/02/12 职场文书
读书之星事迹材料
2014/05/12 职场文书
2014年计生标语
2014/06/23 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python