算法(十一)贪婪算法

文章目录

  • 算法简介
    • 算法概念
    • 算法举例
  • 经典问题 -背包问题

算法简介

算法概念

  • 贪婪算法(Greedy)是一种在每一步都采取当前状态下最好的或者最优的选择,从而希望导致结果也是全局最好或者最优的算法。
  • 贪婪算法是当下局部的最优判断,不能回退。
  • 贪婪算法的高效性,以及所求得的答案比较接近最优结果,因此贪心算法可以作为辅助算法或者解决一些要求结果不那么精确的问题。

算法举例

  • 有硬币分值为10、9、4若干枚,问如果组成分值18,最少需要多少枚硬币?
    采用贪心算法,选择当下硬币分值最大的:10,18-10=8,8/4=2。即:1个10、2个4,共需要3枚硬币。实际上我们知道,选择分值为9的硬币,2枚就够了,也就是18/9=2。
    在这里插入图片描述

  • 如果有硬币分值为10、5、1若干枚,问如果组成分值16,最少需要多少枚硬币?
    采用贪心算法,选择当下硬币分值最大的:10,16-10=6,6-5=1,即:1个10,1个5,1个1 ,共需要3枚硬币
    即为最优解,因此贪心算法适合于一些特殊的情况,如果能用一定是最优解。

经典问题 -背包问题

背包问题是算法的经典问题,分为部分背包和0-1背包,主要区别如下:

  • 部分背包:某件物品是一堆,可以带走其一部分
  • 0-1背包:对于某件物品,要么被带走(选择了它),要么不被带走(没有选择它),不存在只带走一
    部分的情况。
    部分背包问题可以用贪心算法求解,且能够得到最优解。

假设一共有N件物品,第 i 件物品的价值为 Vi ,重量为Wi,一个小偷有一个最多只能装下重量为W的背
包,他希望带走的物品越有价值越好,可以带走某件物品的一部分,请问:他应该选择哪些物品?
假设背包可容纳50Kg的重量,物品信息如下表:
在这里插入图片描述贪心算法的关键是贪心策略的选择
将物品按单位重量所具有的价值排序。总是优先选择单位重量下价值最大的物品
按照我们的贪心策略,单位重量的价值排序: 物品A > 物品B > 物品C
因此,我们尽可能地多拿物品A,直到将物品1拿完之后,才去拿物品B,然后是物品C 可以只拿一部
分…

package com.xxliao.algorithms.greedy.demo01;import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;/*** @author xxliao* @description: 贪心算法 - 背包问题* @date 2024/5/31 19:05*/
public class Greedy {public static void main(String[] args) {Greedy greedy = new Greedy();List<Goods> goodslist = new ArrayList<>();goodslist.add(new Goods("A", 10, 60));goodslist.add(new Goods("C", 30, 120));goodslist.add(new Goods("B", 20, 100));greedy.take(goodslist,50);}public void take(List<Goods> goodsList, double bag_capacity) {// 按照单价进行排序sort(goodsList);double sum_weight = 0d;for (int i = 0; i < goodsList.size(); i++) {sum_weight += goodsList.get(i).getWeight();if(sum_weight <= bag_capacity){System.out.println(goodsList.get(i).name + "取" + goodsList.get(i).weight + "kg");}else {System.out.println(goodsList.get(i).name+ "取" +(bag_capacity-(sum_weight - goodsList.get(i).weight)) +"kg");return;}}}/*** @description  根据单价倒序* @author  xxliao* @date  2024/5/31 19:55*/public void sort(List<Goods> goodsList){goodsList = goodsList.stream().sorted(Comparator.comparing(Goods::getPrice).reversed()).collect(Collectors.toList());}
}

演示结果:
在这里插入图片描述

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

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

相关文章

无忧易售ERP:解锁TikTok平台订单处理新效能,赋能跨境电商新未来

在这个全球化电商飞速发展的时代&#xff0c;TikTok作为新兴的电商蓝海&#xff0c;正吸引着无数商家的目光。然而&#xff0c;如何在竞争激烈的市场中脱颖而出&#xff0c;高效管理订单&#xff0c;提升顾客体验&#xff0c;成为每个商家必须面对的课题。无忧易售ERP&#xff…

NSS题目练习5

[NISACTF 2022]babyupload 打开后尝试上传php&#xff0c;jpg&#xff0c;png文件都没成功 查看源代码发现有个/source文件 访问后下载压缩包发现有一个python文件 搜索后知道大致意思是&#xff0c;上传的文件不能有后缀名&#xff0c;上传后生成一个uuid&#xff0c;并将uuid…

基于深度学习的模糊认知图方法

1 文章信息 文章题目为“Deep Fuzzy Cognitive Maps for Interpretable Multivariate Time Series Prediction”&#xff0c;该文于2019年发表于“IEEE TRANSACTIONS ON FUZZY SYSTEMS”。文章提出了深度模糊认知图&#xff08;FCM&#xff09;用于多变量时间序列预测&#xff…

19.Redis之集群

1.集群的基本介绍 集群 这个词.广义的集群,只要你是多个机器,构成了分布式系统, 都可以称为是一个"集群"前面主从结构,哨兵模式,也可以称为是"广义的集群”狭义的集群,redis 提供的集群模式, 这个集群模式之下,主要是要解决,存储空间不足的问题(拓展存储空间) …

科普健康短视频:成都鼎茂宏升文化传媒公司

科普健康短视频&#xff1a;引领健康知识新潮流 在数字化时代的浪潮中&#xff0c;短视频以其短小精悍、直观易懂的特点&#xff0c;迅速成为大众获取信息的重要渠道。其中&#xff0c;科普健康短视频更是凭借其科学、权威、实用的内容&#xff0c;吸引了大量关注健康的观众。…

Linux —— MySQL操作(1)

一、用户与权限管理 1.1 创建与赋予权限 create user peter% identified by 123465 # 创建用户 peter&#xff0c;# %&#xff1a;允许所有用户登录这个用户访问数据库 刚创建的新用户是什么权限都没有&#xff0c;需要赋予权限 grant select on mysql.* to peter%; # 赋予…

什么是数据资产管理?数据资产管理包括了哪些内容?

数据资产管理包括数据模型管理、数据标准管理、数据质量管理等 10 个活动职能&#xff0c;覆盖数据资源化、数据资产化两个阶段。本章参考 PDCA 方法&#xff0c;从计划、执行、检查、改进四个环节着手&#xff0c;阐述数据资产管理活动职能的核心理念与实践要点。 一、数据模型…

使用Python操作Git

大家好&#xff0c;当谈及版本控制系统时&#xff0c;Git是最为广泛使用的一种&#xff0c;而Python作为一门多用途的编程语言&#xff0c;在处理Git仓库时也展现了其强大的能力。通过Python&#xff0c;我们可以轻松地与Git仓库进行交互&#xff0c;执行各种操作&#xff0c;从…

2024全新交友盲盒+付费进群二合一源码 包含全套源码+视频教程

2024全新交友盲盒付费进群二合一源码 包含全套源码视频教程39同校 三九同校 最高版本&#xff0c;纸条&#xff0c;交友&#xff0c;源码&#xff0c;搭建包上线运营&#xff0c;防封红&#xff0c;独家唯一版本盲盒交友脱单系统源码&#xff0c;带教程&#xff0c;免授权这套源…

Golang | Leetcode Golang题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; func getRow(rowIndex int) []int {row : make([]int, rowIndex1)row[0] 1for i : 1; i < rowIndex; i {row[i] row[i-1] * (rowIndex - i 1) / i}return row }

分布式任务队列系统 celery 原理及入门

基本 Celery 是一个简单、灵活且可靠的分布式任务队列系统&#xff0c;用于在后台执行异步任务处理大量消息。支持任务调度、任务分发和结果存储&#xff0c;并且可以与消息代理&#xff08;如 RabbitMQ、Redis 等&#xff09;一起工作&#xff0c;以实现任务的队列管理和执行…

[Linux系统编程]文件IO

一.系统调用 什么是系统调用? 只有系统调用(系统函数)才能进入内核空间&#xff0c;库函数也是调用系统函数&#xff0c;才得以访问底层。 系统调用由操作系统实现并提供给外部应用程序的编程接口。是应用程序同系统之间数据交互的桥梁。 换句话说&#xff0c;系统调用就是操…

【计算Nei遗传距离】

报错 Warning message: In adegenet::df2genind(t(x), sep sep, ...) : Markers with no scored alleles have been removed 原因&#xff1a; 直接用plink转换为VCF&#xff0c;丢失了等位基因分型&#xff08;REF ALT&#xff09; &#xff08;plink编码的规则&…

优选算法一:双指针算法与练习(移动0)

目录 双指针算法讲解 移动零 双指针算法讲解 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是快慢指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最…

【Linux】进程(2):进程状态

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;1&#xff09;&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 &#xff08;A&#xff09;R/S/D/T/t状态1. R&#xff1a;程序运…

Day-04python模块

一、模块 1-1 Python 自带模块 Json模块 处理json数据 {"key":"value"} json不是字典 本质是一个有引号的字符串数据 json注意点 {} 中的数据是字符串引号必须是双引号 使用json模块可以实现将json转为字典&#xff0c;使用字典的方法操作数据 。 或者将…

社交媒体数据恢复:最右

第一步&#xff1a;确认数据丢失原因 请确定您是因为误删、设备损坏还是其他原因导致“最右”中的数据丢失。这将有助于您更好地了解需要采取的恢复措施。 第二步&#xff1a;尝试从备份中恢复数据 如果您有定期备份的习惯&#xff0c;请尝试从备份中恢复丢失的数据。备份文…

Springboot JVM监控 通过Promethus

Springboot内置了对Prometheus得支持&#xff0c;可以监测得点有&#xff1a; JVM各指标参数&#xff08;GC&#xff0c;堆&#xff0c;非堆等&#xff09;接口调用次数&#xff0c;延时系统内存&#xff0c;IO&#xff0c;CPU使用率 部署Prometheus和Grafana 准备一台2核4G…

STM32自己从零开始实操03:输出部分原理图

一、继电器电路 1.1指路 延续使用 JZC-33F-012-ZS3 继电器&#xff0c;设计出以小电流撬动大电流的继电器电路。 &#xff08;提示&#xff09;电路需要包含&#xff1a;三极管开关电路、续流二极管、滤波电容、指示灯、输出部分。 1.2数据手册重要信息提炼 联系排列&…

手写HTML字符串解析成对应的 AST语法树

先看效果 展示如下&#xff1a; HTML模版 转成ast语法树后 在学习之前&#xff0c;我们需要了解这么一个问题&#xff0c;为什么要将HTML字符串解析成对应的 AST语法树。 为什么&#xff1f; 语法分析&#xff1a;HTML字符串是一种标记语言&#xff0c;其中包含了大量的标签…