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中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
进一步理解Python中的函数编程
Apr 13 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
Python heapq使用详解及实例代码
Jan 25 Python
详解python中的 is 操作符
Dec 26 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
keras 多任务多loss实例
Jun 22 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
Python图片检索之以图搜图
May 31 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 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 保留小数点
2009/04/21 PHP
php中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
Python设计模式之中介模式简单示例
2018/01/09 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
运动会跳远广播稿
2014/02/04 职场文书
新任教师自我鉴定
2014/02/24 职场文书
财产公证书格式
2014/04/10 职场文书
活动总结格式
2014/08/30 职场文书
教书育人演讲稿
2014/09/11 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
进行数据处理的6个 Python 代码块分享
2022/04/06 Python