漫画:什么是“贪心算法”?如何求解“部分背包问题”?

68d84238636dd6abf9f1203871af1f91.gif

作者 | 小灰

来源 | 程序员小灰

1fb2cee05b4d7fbaa45adca25b01652e.png

c44c37955328c5a2d0868c387682263c.png

—————  第二天  —————

52913ae4c41f220583e6265a0eff4163.png

4362d85c308d5e9a23743eb33a1fe845.png

740e60039b35a658b821cc0645f5590e.png

b3297bbde9ce18679a0d16f0bcbbc753.png

31cfac8a431ef4f8d10f52b1b759fd03.png

a677a9061a09473d2fad0d8231c485f0.png

5f0b8952cdd7ab4c696f6f53394b44dd.png

1d29d6ce800a7a8a4f07e401675b146c.png

0b56dd22468fe3c9669547f5891dd31f.png

————————————

d8ab775f9db78a8af7710f2473ac76fd.png

f1651378f8909b02009d8ad2ad32cc7e.png

db66deae2f5e1206bbcc25a669d7c6ee.png

. . . . . . . .

f5c33338301a6b5b7a4423f3e38e02ae.png

399e3a4f40d3f40db6ac15f90b251dc6.png

c147e68d58802c66cb84f8c888614801.png

b86b6ee3f7e3e6d4c775cc179272ce28.png

605f6c1cc7c4f8de8e58cefd97e5d7c7.png

我们回到刚才的题目当中,假设背包的容量是10,有5个商品可供选择,每个商品的价值和重量如图所示:

a1e093eae8a193be51bb4b102d4360ea.png

0e65023e3f06235619efb1ee7676b7f9.png

9472c9272ca94d1dade93803b39d7251.png

4676c4ad2a3d5d2d31a31b16ce1215fd.png

让我们来计算一下每件物品的性价比,其结果如下:

ccf65a2fbb2f489c089fd002f002f963.png

毫无疑问,此时性价比最高的是物品4,我们把物品4放入背包当中,背包剩余的容量是8:

b0db7554515a17e8336ead9426d9b10c.png

21d88a05eacfb8d8637d3bef6b685388.png

4bb72e335bfa7c73f04e45d0e875ae24.png

4e7e73d5eff2d752d71420cf50eb7cc1.png

我们选择物品1放入背包,背包剩余的容量是4:

646a9a165cd76e2269a2dbb631cd9417.png

c852da1af19e81cbd64e881193ea8d67.png

e7aa4a71dc2543118d6653222297eeb5.png

于是,我们选择0.8份的物品5放入背包,背包剩余的容量为0:

13663b4a99747bd64bd50920699cdb10.png

186511330ec51d18da540b34af42930d.png

add7251b0f2a76091da8d91e01349163.png

266cd2de73fbf9115560d7f34d1b4686.png

7c2ec20495fbe254fc871a6fc0c565bb.png

32a461ea1fd1c1e42d51558325732f3b.png

public static void main(String[] args) {int capacity = 10;int[] weights = {4,6,3,2,5};int[] values = {9,3,1,6,5};System.out.println("背包最大价值:" + getHighestValue(capacity, weights, values));}public static double getHighestValue(int capacity, int[] weights,int[] values){//创建物品列表并按照性价比倒序List<Item> itemList = new ArrayList<>();for(int i=0;i<weights.length;i++){itemList.add(new Item(weights[i], values[i]));}itemList = itemList.stream().sorted(Comparator.comparing(Item::getRatio).reversed()).collect(Collectors.toList());//背包剩余容量int restCapacity = capacity;//当前背包物品的最大价值double highestValue = 0;//按照性价比从高到低选择物品for(Item item : itemList){if(item.weight <= restCapacity){highestValue += item.value;restCapacity -= item.weight;}else{//背包装不下完整物品时,选择该件物品的一部分highestValue += (double)restCapacity/(double)item.weight * item.value;break;}}return highestValue;}static class Item {private int weight;private int value;//物品的性价比private double ratio;public Item (int weight, int value){this.weight = weight;this.value = value;this.ratio = (double)value / (double)weight;}public double getRatio() {return ratio;}}

在这段代码当中,我们借助了静态内部类Item,从而更方便地记录性价比、获取重量和价值信息、按性价比排序。

b8838ed43efc802df13555b03376d2e4.png

d8a0710af09ece21b9ea1a94571253ae.png

75b4e3b858940edef0d7fd21d2811d16.png

2fd4aa309a7937e64fe3b427a6ffbfe4.png

仍然给定一个容量是10的背包,有如下三个物品可供选择:

60cf154f31904e3e75c9746428805b8d.png

这一次我们有个条件限制:只允许选择整个物品,不能选择物品的一部分。

如果按照贪心算法的思路,首先选择的是性价比最高的物品1,那么背包剩余容量是4,再也装不下其他物品,而此时的总价值是6:

7d500fc4bf4027e8bd12285ff4c57700.png

但这样的选择,真的能让总价值最大化吗?如果我们不选择物品1,选择物品2和物品3的话,剩余容量是0,总价值是7:

ed97777b2f501e3d776707341ddf5965.png

显然,7>6,依靠贪心算法得出的结果,未必是全局最优解。

d2fa7ce5c4ef932b37b625c48aa5a5c1.png

2a20a3a2c8eb14c4f6c5eb556393b11c.png

fe0cf3d714b4b6a217e554793a771fba.png

155a9fcf3b1ffcdafa710eab8bff4291.png

6d477ce8edfe2751a6c7030d8b5a51a8.gif

9f5ff00909341de7ef1d5946f9f92480.png

往期推荐

阿里云投入 20 亿发力操作系统

移动云API大赛决赛大奖花落谁家?

Redis很厉害,使用规范来啦

阿里云发布首颗云芯片倚天710

e59f9bcc7093a9b79445465907556da8.gif

点分享

87618b1fa8ed669188504ca363107a29.gif

点收藏

b0c919e842e062d7c8d51366ea6b9e72.gif

点点赞

f55804b176172e826bbf870d5fd67fff.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高德 Serverless 平台建设及实践

简介&#xff1a; 高德为什么要搞 Serverless/Faas&#xff1f;是如何做 Serverless/Faas 的&#xff1f;技术方案是什么样的&#xff1f;目前进展怎么样&#xff1f;后续又有哪些计划&#xff1f;本文将和大家做一个简单的分享。 作者 | 邓学祥&#xff08;祥翼&#xff09; 来…

谷歌自研 Tensor 芯片,8核CPU,20核GPU……

作者 | 禾木木 出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 10 月 20 日&#xff0c;谷歌在发布会上推出了全新 Pixel 6 和 Pixel 6 Pro 手机。虽然在推出之前&#xff0c;就已经知晓了外观&#xff0c;该说不说这款手机还是很吸引人的。 在这些变化…

云厂商下一块必争之地就是它了!

简介&#xff1a; 继容器编排、AI 工程化之后&#xff0c;全球顶级云厂商都瞄准了这块无人区。 作者 | 太浪 继容器编排、AI 工程化之后&#xff0c;全球顶级云厂商都瞄准了这块无人区。 1 回顾云计算十几年的历史&#xff0c;或者也可以视其为一部“为开发者服务简史”。 …

shell 如何调用多个脚本

简介 这篇文章主要描述如何通过主脚本去调用其他脚本中的方法&#xff0c;调用的过程中可能出现哪些坑&#xff0c;如何避免。 目录 1. 主脚本调用其他脚本的方法 1.1. bash方法 1.2. source方法 2. 避坑技巧 2.1. 路径配置无效 2.2. source变量冲突 3. 总结 1. 主脚本调…

es对已有的索引给主键_ES中对索引的相关操作

写在前面&#xff1a;本文ES版本为&#xff1a;6.4.2(单机)&#xff0c;并安装了head插件&#xff0c;运用postman进行操作。也可以使用head插件在前端浏览器中进行傻瓜式操作&#xff0c;后续会介绍这种方式&#xff01;如果没有安装es和head插件的话&#xff0c;请先安装&…

“华为云-东吴杯”圆满成功,顶尖参赛者推动“智造”场景结构升级

2021年10月9日&#xff0c;“华为云-东吴杯”2021数字化转型创新应用大赛&#xff08;以下简称“华为云-东吴杯”&#xff09;的最终决赛如期上演&#xff0c;给来自创客赛道和企业赛道的顶尖开发者及团队搭建了一个绝佳的舞台&#xff0c;令其充分展示投身数字化转型领域所获得…

云原生下的灰度体系建设

简介&#xff1a; 本篇文章&#xff0c;我们将继续为大家介绍 ASI SRE&#xff08;ASI&#xff0c;Alibaba Serverless infrastructure&#xff0c;阿里巴巴针对云原生应用设计的统一基础设施&#xff09; 是如何探索在 Kubernetes 体系下&#xff0c;建设 ASI 自身基础设施在大…

引用和指针的区别都有什么_C++指针与引用的区别

指针与引用是C中两个很重要的概念&#xff0c;它们功能看过去很相似&#xff0c;就是都是间接引用某个对象&#xff0c;那么我们应该在什么时候使用指针&#xff0c;什么时候使用引用呢&#xff0c;下面请允许我慢慢道来&#xff1a;1.永远不要使用一个指向空值的引用。一个引用…

混合云K8s容器化应用弹性伸缩实战

简介&#xff1a; 混合云K8s容器化应用弹性伸缩实战1. 前提条件 本最佳实践的软件环境要求如下&#xff1a; 应用环境&#xff1a; ①容器服务ACK基于专有云V3.10.0版本。 ②公共云云企业网服务CEN。 ③公共云弹性伸缩组服务ESS。 配置条件&#xff1a; 1&#xff09;使用专有云…

lodop打印不显示页码_Excel|13个Excel打印技巧汇总,打印技巧大全

打印技巧是工作必备&#xff0c;无需理由&#xff01;很多时候大家得不到想要的打印效果&#xff0c;偶尔打印一两张表格&#xff0c;会出现各种状况&#xff1a;标题行不见了&#xff1f;打印范围错了&#xff1f;页眉页脚不对&#xff1f;打印一个内容&#xff0c;总得弄出一…

关于写好文章的3个心法和5点技巧

简介&#xff1a; 技术类文章最需要的是扎实的经验累积、深度思考和精益求精的精神&#xff0c;这些技巧&#xff0c;希望能够锦上添花。 作者 | 双宏 来源 | 阿里技术公众号 我是双宏&#xff0c;负责阿里巴巴内部技术人社区的内容运营&#xff0c;包括每天头条热文专题推荐、…

工商银行分布式服务 C10K 场景解决方案

简介&#xff1a; Dubbo 是一款轻量级的开源 Java 服务框架&#xff0c;是众多企业在建设分布式服务架构时的首选。中国工商银行自 2014 年开始探索分布式架构转型工作&#xff0c;基于开源 Dubbo 自主研发了分布式服务平台。 作者 | 颜高飞 来源 | 阿里巴巴云原生公众号 Dubb…

matlab cell转数组_MATLAB批量修改文件名

评论区旁友建议使用narsort排序而不是直接修改文件名。我觉得相关条件下也可以&#xff0c;所以原文末尾加上了narsot排序法。以下是原文2019-05-09最近实验室小可爱帮忙做实验和记录实验数据&#xff0c;不过新手总有些错误操作&#xff0c;比方说因为忘记修改存储路径导致图片…

Spring Cloud Bus 消息总线介绍

简介&#xff1a; 本文配套可交互教程已登录阿里云知行动手实验室&#xff0c;PC 端登录 start.aliyun.com 在浏览器中立即体验。 作者 | 洛夜 来源 | 阿里巴巴云原生公众号 本文配套可交互教程已登录阿里云知行动手实验室&#xff0c;PC 端登录 start.aliyun.com 在浏览器中立…

更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性

简介&#xff1a; 在正文开始之前&#xff0c;我们先回顾一下单元化部署的概念和设计理念。在边缘计算场景下&#xff0c;计算节点具有很明显的地域分布属性&#xff0c;相同的应用可能需要部署在不同地域下的计算节点上。 作者 | 张杰&#xff08;冰羽&#xff09; 来源 | 阿里…

Gartner:2022年全球IT支出将超4万亿美元,软件增速最高

编辑 | 宋慧 供稿 | Gartner 根据Gartner的最新预测&#xff0c;2022年全球IT支出预计将达到4.5万亿美元&#xff0c;相比2021年增长5.5%。 Gartner杰出研究副总裁John-David Lovelock表示&#xff1a;“越来越多的企业将构建新技术和软件&#xff0c;而不是购买和部署它们&am…

Flink 实时计算在微博的应用

简介&#xff1a; 微博通过将 Flink 实时流计算框架跟业务场景相结合&#xff0c;在平台化、服务化方面做了很大的工作&#xff0c;在开发效率、稳定性方面也做了很多优化。我们通过模块化设计和平台化开发&#xff0c;提高开发效率。 微博机器学习研发中心数据计算负责人&…

移动云帮我养出了一片致富鱼塘

“通过U鱼智慧管理平台&#xff0c;水产养殖由‘人治’转变为‘智治’&#xff0c;养得舒心、卖得放心、吃得安心。”广东省渔业种质保护中心相关负责人表示。准确研究&#xff0c;提升科学养殖水平广东省渔业种质保护中心坐落于广州市南沙区东涌镇&#xff0c;占地580亩&#…

sketch里的ios控件_使用Sketch建立Design System

一、 有关Design System之前的文章《使用Adobe XD建立Design System》中介绍了什么是Design System&#xff0c;它有什么用&#xff0c;在设计的哪个阶段使用以及如何用Adobe XD来搭建。这篇文章主要侧重在UI风格已确定的设计后期&#xff0c;用Sketch工具来搭建一个Design Sys…

论好文章和烂文章

简介&#xff1a; 我们为何写作&#xff1f;对于许多技术同学来说&#xff0c;写作是一件比写代码困难许多的事情&#xff0c;和电脑相顾无言数小时&#xff0c;发现自己写不出什么像样的东西来&#xff0c;着实不是一种很好的体验。 作者 | 许晓斌 来源 | 阿里巴巴云原生公众号…