算法(十一)贪婪算法

ops/2024/9/23 11:19:20/

文章目录

算法简介

算法概念

  • 贪婪算法(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.ppmy.cn/ops/46119.html

相关文章

Python与语法:深入剖析编程语言的核心要素

Python与语法&#xff1a;深入剖析编程语言的核心要素 Python&#xff0c;作为一门广泛应用的编程语言&#xff0c;其语法规则在编程实践中起着至关重要的作用。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析Python语法的核心要素&#xff0c;帮助读者…

The First项目报告:一场由社区驱动的去中心化加密冒险—Turbo

2023年3月14日&#xff0c;由OpenAI公司开发自回归语言模型GPT-4发布上线&#xff0c;一时之间引发AI智能领域的轩然大波&#xff0c;同时受到影响的还有加密行业&#xff0c;一众AI代币纷纷出现大幅度拉升。与此同时&#xff0c;一款名为Turbo的Meme代币出现在市场中&#xff…

SwiftUI 5.0(iOS 17)进一步定制 TipKit 外观让撸码如虎添翼

概览 在之前 SwiftUI 5.0&#xff08;iOS 17&#xff09;TipKit 让用户更懂你的 App 这篇博文里&#xff0c;我们已经初步介绍过了 TipKit 的基本知识。 现在&#xff0c;让我们来看看如何进一步利用 SwiftUI 对 TipKit 提供的细粒度外观定制技巧&#xff0c;让 Tip 更加“明眸…

低代码平台:教育机构数字化转型的技术新引擎

在数字化浪潮汹涌而来的今天&#xff0c;教育行业正迎来前所未有的变革。随着技术的不断进步和教育理念的更新&#xff0c;越来越多的教育机构开始意识到数字化转型的重要性。而在这场转型的浪潮中&#xff0c;低代码平台以其独特的优势&#xff0c;正成为教育机构实现数字化转…

k8s自定义资源你会创建吗

创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition&#xff08;CRD&#xff09;时&#xff0c;Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的&#xff0c;也可以是集群作用域的…

MongoDB~俩大特点管道聚合和数据压缩(snappy)

场景 在MySQL中&#xff0c;通常会涉及多个表的一些操作&#xff0c;MongoDB也类似&#xff0c;有时需要将多个文档甚至是多个集合汇总到一起计算分析&#xff08;比如求和、取最大值&#xff09;并返回计算后的结果&#xff0c;这个过程被称为 聚合操作 。 根据官方文档介绍&…

php之文件操作代码审计

1 PHP文件操作函数 1.1 PHP文件操作函数 文件包含 include/require/include_once/require_once 文件读取 file_get_contents/fread/readfile/file 文件写入 file_put_contents/fwrite/mkdir/fputs 文件删除 unlink/rmdir 文件上传 move_uploaded_file/copy/rename 1.2 文…

使用ssh连接ubuntu

一、下载连接工具 常见的连接工具右fianlshell、xshell等等。在本文章中使用的finalshell&#xff0c;工具可以去官网上下载&#xff0c;官网下载。 二、Ubuntu中配置shh 1、使用下面指令更新软件包&#xff08;常用于下载安装或更新软件时使用&#xff0c;更新到最新的安装…