贪心算法之背包问题

贪心算法之背包问题

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
 
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
 
完全背包问题:给定n个物品和一个容量为C的背包,物品i的重量是Wi,其价值为Vi,背包问题是如何选择入背包的物品,使得装入背包的物品的总价值最大,与0-1背包的区别是,在完全背包问题中,可以将物品的一部分装入背包,但不能重复装入。
 
设计算法的思路很简单,计算物品的单位价值,然后尽可能多的将单位重量价值高的物品放入背包中。
 
python实现代码如下:

 1 # coding=gbk
 2 # 完全背包问题,贪心算法
 3 import time
 4 __author__ = 'ice'
 5 
 6 
 7 class goods:
 8     def __init__(self, goods_id, weight=0, value=0):
 9         self.id = goods_id
10         self.weight = weight
11         self.value = value
12 
13 
14 # 不适用于0-1背包
15 def knapsack(capacity=0, goods_set=[]):
16     # 按单位价值量排序
17     goods_set.sort(key=lambda obj: obj.value / obj.weight, reverse=True)
18     result = []
19     for a_goods in goods_set:
20         if capacity < a_goods.weight:
21             break
22         result.append(a_goods)
23         capacity -= a_goods.weight
24     if len(result) < len(goods_set) and capacity != 0:
25         result.append(goods(a_goods.id, capacity, a_goods.value * capacity / a_goods.weight))
26     return result
27 
28 
29 some_goods = [goods(0, 2, 4), goods(1, 8, 6), goods(2, 5, 3), goods(3, 2, 8), goods(4, 1, 2)]
30 
31 start_time = time.clock()
32 res = knapsack(6, some_goods)
33 end_time = time.clock()
34 print('花费时间:' + str(end_time - start_time))
35 
36 for obj in res:
37     print('物品编号:' + str(obj.id) + ' ,放入重量:' + str(obj.weight) + ',放入的价值:' + str(obj.value), end=',')
38     print('单位价值量为:' + str(obj.value / obj.weight))
39 
40 
41 # 花费时间:2.2807240614677942e-05
42 # 物品编号:3 ,放入重量:2,放入的价值:8,单位价值量为:4.0
43 # 物品编号:0 ,放入重量:2,放入的价值:4,单位价值量为:2.0
44 # 物品编号:4 ,放入重量:1,放入的价值:2,单位价值量为:2.0
45 # 物品编号:1 ,放入重量:1,放入的价值:0.75,单位价值量为:0.75

 

转载于:https://www.cnblogs.com/z941030/p/4961886.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109251.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux 配置Java环境(图文详细)

    Linux 配置Java环境(图文详细)Linux配置Java环境1、查看系统是否有java环境2、卸载系统自带的jdk1.找到具体的jdk2.然后分别一个一个删除3.验证是否删除成功3、创建一个文件夹用于存放java的压缩包4、包下载好的jdk拖到java文件夹5、安装jdk6、配置环境变量7、让配置生效8、验证是否配置成功1、查看系统是否有java环境输入指令java-version回车即可如图表示Linux系统有自带的jdk,但是这并不是我们想要的,所以得卸载2、卸载系统自带的jdk1.找到具体的jdkrpm-qa

    2022年5月7日
  • 小白/新人学Python,用哪个编辑器?VSCode还是PyCharm?[通俗易懂]

    小白/新人学Python,用哪个编辑器?VSCode还是PyCharm?[通俗易懂]先说结论:优先选择PyCharm,不论你学习Python的目的是什么:数据科学/金融/爬虫/网页开发/…原因如下:超全Python编辑器大总结,优缺点一目了然!从功能上说,最全面的只有2个:VSCode和PyCharm,VSCode不适合小白的原因:需要单独配置Python和各种框架的开发环境,运行界面更加复杂PyCharm适合小白的原因:安装和配置简单,所有代码都可以一键运行,小白一看就会。PyCharm下载/安装/配置/使用:视频教程…

    2022年8月29日
  • 协同过滤推荐算法研究

    针对电子商务发展的需求,本文通过对协同过滤推荐算法的文献综述,提出传统过滤算法无法适用于用户多兴趣下的推荐问题进行了剖析,提出了一种基于用户多兴趣的协同过滤推荐改进算法,分析了基于用户多兴趣的协同过滤推荐算法的电子商务系统。
      一、引言
      电子商务迅猛发展的时代已经到来,网上购物的交易方式正在改变着传统的商业模式。2007年,电子商务的交易额达到了8900亿人民币。面对如此众多的商品,无疑会大大增加用户发现满意商品的困难。于是个性化推荐系统逐渐成为电子商务领域中的一项重要

    2022年4月8日
  • java面试题及答案整理_nginx优化面试

    java面试题及答案整理_nginx优化面试nginx负载均衡的算法怎么实现的nginx的upstream目前支持4种方式的分配1)、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。2)、weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。2)、ip_hash每个请求按访问ip…

    2022年8月27日
  • 虚拟化漏洞3种解决方案_怎么实现漏洞复现的

    虚拟化漏洞3种解决方案_怎么实现漏洞复现的利用虚拟机复现漏洞“永恒之蓝”攻击:kaliLinux2020.3靶机:WindowsServer2008R2x64下面详细讲述测试的过程。————“永恒之蓝”简介利用Windows系统的SMB漏洞可以获取系统最高权限。于2017年在全球的范围内大面积爆发,不法分子利用这个漏洞制作了勒索病毒,锁定被攻击的设备,并要求支付高额赎金。“永恒之蓝”的原理主要是扫描所有开放445文件共享端口的Windows机器。这里进行测试要用到一个工具MSF,能快速

    2022年10月16日
  • Charles抓包神器

    Charles抓包神器Charles抓包神器Charles抓包过程插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器,当程序连接…

    2022年6月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号