【算法】贪心算法解析:基本概念、策略证明与代码例题演示

news2024/11/14 13:54:42

文章目录

  • 1. 什么是贪心算法?
  • 2. 贪心算法的特点
  • 3. 例题(贪心策略)
    • ① 找零问题
    • ② 最小路径和
    • ③ 背包问题
  • 4. 贪心策略证明


1. 什么是贪心算法?

在学习贪心算法之前,一定要理解的是贪心策略

贪心策略是一种根据具体问题而定的策略:其由局部优先 -> 全局有限,解释如下

  1. 把解决问题的办法分为若干步;
  2. 解决每一步的时候,都选择目前看起来 “最优” 的解法
  3. 最后结果希望得到最优解

2. 贪心算法的特点

贪心算法的特点,可以先看下面的例题再来理解就很轻松了。

  1. 贪心策略提出

    • 贪心策略并没有 标准模板
    • 根据具体题目而提出具体的策略
  2. 贪心策略的正确性

    • 贪心策略得出的结果可能是错误的
    • 正确的贪心策略,需要由我们证明的

3. 例题(贪心策略)

① 找零问题

假设有50元,买了六元的东西,需要找零44元。你有以下序列的纸币[20,10,5,1](每张面值的纸币有无限多个),要求你用最少的纸币张数进行找零。

我们以贪心策略去思考这个问题:要尽可能的选面值大的纸币找零,即为贪心,则
46 = 20+20+5+1。

根据贪心算法最终选择了四张纸币,不难看出该选择就是最佳选择。

在这里插入图片描述

② 最小路径和

有下面一个矩阵,我们处于矩阵左上角,目的地为右下角,希望得到最小路径和。所走的方向只有→和↓两种方向。

在这里插入图片描述

根据贪心策略:因为题目要求最小路径和,则我们每次走当前看到的最小数值的位置,则如下图所示,最终路径和为 1+1+6+2+1=11。而最佳路径显然为1+3+1+1+1=7。

在这里插入图片描述

③ 背包问题

看下面的表格,有以下物品,分别有重量和价值两个指标(重量与价值成正相关),每个商品有无穷多个。
我们有一个 承重为10的背包,希望得到背包装的总价值最高的装法。

物品1物品2物品3
重量651
价值1291

由于这道题对我们装法的影响因素有两个,重量和价值,所以贪心策略可以分多种进行:

  1. 只看重量:为了获得更高价值的东西,我们需要尽可能多的物体,则选择重量更小的物品,则在背包承重范围内我们最终选择的总价为1+1+…+1(n=10)=10
  2. 只看价值:我们尽可能去选择价值高的物品,则最终价格为12+1+1+1+1=16
  3. 看单位重量价值:通过下面的计算,我们可以计算出每个物品的单位重量价值,则贪心策略为选择单位价值最高的物品,最后总价为12+1+1+1+1 = 16

在这里插入图片描述

但实际上,根据三种贪心策略得出的结果都不是最佳选择,最佳策略为,选两个重量为5的物品,总价值为18。


我们会发现,由贪心策略得出的结果,对于例二例三都是错误的,而例一找零问题是正确的,实际上,当我们将找零问题的数据进行改动,如需要找零36元,我们有以下面额的纸币[20, 18, 10, 5, 1],按照之前的贪心策略,最终结果为,一共4张纸币,而最佳策略为选择两张面额18的纸币,一共需两张。


4. 贪心策略证明

我们知道:正确的贪心策略,需要由我们证明的。

那么如何证明呢?
答:我们学习数学时所使用了解过的证明方法通通可行;直接证明、反证、数学归纳…

这里我们就来证明 为什么例一中的找零问题是正确的

在这里插入图片描述

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

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

相关文章

Ubuntu中qt类与类信号槽的创建及使用

今天学习到了新的一个小玩意,我们在QT中创建一个大项目的时候一般会创建多个类,那我们就来学习一下如何在自定义的类中声名和使用信号与槽函数。 首先我们CTRLn来创建我们新的类: 我们创建新的C的类,一个School,一个S…

举办知识竞赛是线上好还是线下好

举办知识竞赛线上和线下各有优势,选择哪种方式取决于具体的需求和条件。 线上举办知识竞赛的优缺点: 优点: 便捷性:线上竞赛不受地域限制,参与者可以在任何有网络的地方参与。 选手数:可以同时满足人数较…

单门店共享自习室小程序系统源码搭建对接门禁和空开api

共享自习室小程序,单门店共享自习室小程序,有源码,对接门禁和电控api接口,php开发语言,前端是uniapp。可以源码搭建,也可以二开或定制。 一 用户端 在线选择预约时间,选择座位,选择…

macOS搭建Python3.11+Django4.2.15的平台框架使用Poetry管理

最近想使用Python开发,使用Django框架搭建平台,之前没有使用过Python,所以记录下整个过程: 1、Python版本的选择,直接去官网【Download Python | Python.org】看最新稳定版是哪个版本,选择安装&#xff0c…

Ascend C算子开发(入门)—— 什么是算子?

文章目录 Ascend C算子开发(入门)—— 什么是算子?一、从人工智能到算子1.1 人工智能的四个层面1.2 人工智能之三大流派1.3 算子、神经元、神经网络 二、算子的基本概念2.1 算子在数学中的定义:2.2 算子基本概念 —— 总览2.3 算子…

利用clip模型实现text2draw

参考论文 实践 有数据增强的代码 import math import collections import CLIP_.clip as clip import torch import torch.nn as nn from torchvision import models, transforms import numpy as np import webp from PIL import Image import skimage import torchvision …

基于单片机的楼宇消防控制系统设计

本设计基于单片机的楼宇消防控制系统,主要包括温湿度检测模块、空气质量检测模块、火焰检测模块、ZigBee通信模块、报警模块和自动喷水模块。首先,系统通过温湿度检测模块实时监测楼道内的温湿度状况,以便及时掌握火灾发生前的环境变化。其次…

足底筋膜炎怎么治疗效果好

足底筋膜炎的症状 足底筋膜炎是一种常见的足部疾病,主要表现为足底区域(尤其是脚跟附近)的疼痛和不适。这种疼痛在早晨起床或长时间休息后初次站立时尤为明显,被形象地称为“晨间痛”。随着行走时间的增加,疼痛可能会…

直击源头!劳保鞋厂家揭秘机械制造业防护安全鞋挑选秘籍

在机械制造业这一高风险、高强度的行业中,选择合适的劳保鞋对于保障工人的安全至关重要。作为劳保鞋的生产厂家,我们深知一双优质的防护鞋能为工人提供怎样的保护。今天百华小编和大家从多个维度看一下机械制造业是如何挑选防护安全鞋的挑选秘籍&#xf…

四款远程控制分享!你pick哪一款?

远程控制软件已经成为我们日常生活中不可或缺的一部分,无论是远程办公、技术支持还是家庭娱乐,这些软件都扮演着重要的角色。今天,我们就来聊聊几款市面上比较热门的远程控制软件在电脑远程操作上都有哪些表现呢?让我们一探究竟。…

ArkTS语法题

1. 下面示例中会导致编译报错的有? A. let x: number null; B. let x: number | null null; C. let y: string null; D. let y: string 100; 看来GPT对这种标准概念选择,也没有统一的说法。 - 文心…

【3.8】贪心算法-解无重叠区间

一、题目 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠…

ImportError: Missing optional dependency ‘openpyxl‘.报错已解决

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言: 在开发过程中,你是否遇到过导入模块时出现ImportError: Missing optional dependency openpyxl的…

绘制YOLOv9训练结果的mAP0.5变化曲线

本文绘制mAP0.5在训练过程中的变化曲线(Python脚本),用以比较不同算法的收敛速度,最终精度等,并且能够在论文中直观的展示改进效果。 以下是比较了三个模型的mAP0.5变化曲线,数据来源是直接读取三个训练完…

Flink1.14.* 各种算子在StreamTask控制下如何调用的源码

前言:一、StreamTask执行算子的生命周期二、 Source的streamTask用的是SourceStreamTask三、基础转换操作,窗口用的是OneInputStreamTask1、初始化OneInputStreamTask2、StreamTask运行invoke调用的是StreamTask的processInput方法3、从缓冲区获取数据放…

从0到DevOps(1)-初步了解DevOps和容器

DevOps从提出以来陆续成为行业普遍实践,目前是数字化生产普遍不可或缺的信息底座。本系列文章旨在系统性的阐述与认识DevOps, 了解企业实践里DevOps的实际面貌。 什么是DevOps? DevOps 是一套实践、工具和文化理念,为实现用户不断的软件功能和可用性要…

学会这5个AI变现方法,让你在小红书上轻松赚钱!

大家好!最近AI真是大火,尤其是ChatGPT、Midjourney这些AI工具,感觉不搞点AI相关的内容,都跟不上潮流啦! 作为一个深耕小红书的内容创作者,我发现AI其实在小红书上有着巨大的变现潜力。 那么,如…

C--四种排序方法的补充

上一篇文章因为时间原因只写了三种,这一篇来补充第四种,第四种的代码更多,所需要理解的也是更多的。 堆排序 想要学会堆排序,你必须了解二叉树的内容。堆排序的排序速度也是非常的快。 这里都已大堆为例 1.向上调整算法&#…

JavaWeb - Spring Boot

Spring 官网​​​​​Spring | Home Spring Boot Spring Boot是一个由Pivotal团队提供的开源框架,旨在简化Spring应用的初始搭建以及开发过程。在Spring Boot项目中,通常会有Controller、Service、Mapper和Entity等层次结构。下面将详细介绍这些层次的…

Mac 安装Hadoop教程

1. 引言 本教程旨在介绍在Mac 电脑上安装Hadoop,便于编程开发人员对大数据技术的熟悉和掌握。 2.前提条件 2.1 安装JDK 想要在你的Mac电脑上安装Hadoop,你必须首先安装JDK。具体安装步骤这里就不详细描述了。你可参考Mac 下载JDK8。 2.2 配置ssh环境…