备战蓝桥杯Day28 - 贪心算法

一、贪心算法

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法在有最优子结构的问题中尤为有效。最优子结构指的是问题的最优解可以由子问题的最优解有效地构造出来。贪心算法与动态规划不同,它自顶向下做出贪心选择,不做回溯。

贪心算法的基本思路是:

  1. 建立数学模型来描述问题。
  2. 把求解的问题分成若干个子问题。
  3. 对每一子问题求解,得到子问题的局部最优解。
  4. 把子问题的局部最优解合成原来问题的一个解。

希望利用贪心算法得到问题的整体最优解,必须注意两条性质:

  • 贪心选择性质:这是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。贪心选择是采用从顶向下、以迭代的方式做出相继选择,每做一次选择就将所求问题简化为一个规模更小的子问题。
  • 最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。

贪心算法的优缺点如下:

  • 优点:算法简单,效率高,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它能产生整体最优解或者是整体最优解的近似解。
  • 缺点:因为它并不从整体最优上加以考虑,它在某些情况下所求得的解可能不是整体最优解,只是某种意义上的局部最优解。

二、找零问题 

?假设商店老板需要找零n元钱,钱币的面值有:100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少。

=>思路:

1、利用贪心算法,每次找最优解,先找面值最大的张数,因为面值最大,所需要的张数就会小

2、通过对要找零的钱数取余,再去寻找下一个面值最大的张数,这样循环实现。

代码实现:

t = [100, 50, 20, 5, 1]def change(t, n):m = [0 for _ in range(len(t))]  # 通过列表推导式定义面值所对应的张数for i, money in enumerate(t):m[i] = n // moneyn = n % moneyreturn m, nprint(change(t, 376))

三、背包问题 - 分数背包

?问题描述

一个小偷在某个商店发现有n个商品,第i个商品价值v元,重w千克。他希望拿走的价值尽量高,但他的背包最多只能容纳W千克的东西。他应该拿走哪些商品?

商品1: V1=60  W1=10

商品2: V2=100 W2=20 

商品3: V3=120 W3=30

背包容量:W=50

分数背包: 对于一个商品,小偷可以拿走其中任意一部分。(商品为金砂)

问题思路

通过比较每一个商品的单价来确定要优先拿哪一个商品,拿到商品后将商品数量置为1,将背包的重量减少,计算商品价值综合,此通过循环比较来实现。

在开始算法之前先对商品的单价进行排序,用到了lambda匿名函数,对物品的价格,重量循环便利的时候用到了enumerate函数。

代码实现:

goods = [(60, 10), (120, 30), (100, 20)]
# 先将商品的单价从大到小排序
goods.sort(key=lambda x: x[0]/x[1], reverse=True)def fractional_backpack(goods, w):m = [0 for _ in range(len(goods))]   # 创建列表记录带走商品的数量total_val = 0for i, (price, weight) in enumerate(goods):if w > weight:   # 背包有足够空余的空间带走商品m[i] = 1total_val += price  # 更新价格和重量w -= weightelse:m[i] = w/weighttotal_val += price * m[i]   #计算带走几分之几的价格w = 0breakreturn  total_val, mprint(fractional_backpack(goods, 50))

ps:

lambda函数

lambda 函数是 Python 中的一个轻量级的匿名函数,它允许你快速定义一个只有一行表达式的简单函数。lambda 函数没有自己的名称,因此也被称为匿名函数。它主要用于需要一个函数作为参数的场合,而无需显式地定义一个单独的函数。

lambda 函数的基本语法如下:

lambda arguments: expression
  • arguments 是 lambda 函数的参数,可以有一个或多个,用逗号分隔。
  • expression 是 lambda 函数的返回值,只能有一个表达式。

示例:

# 定义一个简单的 lambda 函数,它接受两个参数并返回它们的和  
add = lambda x, y: x + y  # 使用 lambda 函数  
result = add(3, 4)  
print(result)  # 输出: 7

 

在这个例子中,add 是一个 lambda 函数,它接受两个参数 x 和 y,并返回它们的和。然后我们调用这个 lambda 函数,传入 3 和 4,得到结果 7。

lambda 函数经常与 Python 的内置函数如 map()filter()reduce() 等一起使用,这些函数接受一个函数作为参数,并对序列进行某种操作。

例如,使用 map() 函数和 lambda 函数来将列表中的每个元素平方:

numbers = [1, 2, 3, 4, 5]  
squared = map(lambda x: x ** 2, numbers)  
print(list(squared))  # 输出: [1, 4, 9, 16, 25]

 

在这个例子中,lambda x: x ** 2 是一个简单的 lambda 函数,它接受一个参数 x 并返回 x 的平方。我们使用 map() 函数将这个 lambda 函数应用到 numbers 列表的每一个元素上,得到一个新的迭代器 squared,然后将其转换为列表输出。

虽然 lambda 函数很有用,但它并不适合定义复杂的函数逻辑。对于更复杂的函数,应该使用 def 关键字来定义具名的函数。

 enumerate函数

enumerate() 是 Python 的内置函数,用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

enumerate() 函数的语法如下:

enumerate(iterable, start=0)

参数说明:

  • iterable:一个可遍历的对象,如列表、元组或字符串。
  • start(可选):计数起始值,默认为0。

enumerate() 函数返回的是一个枚举对象,它生成由数据对象的元素和其下标(默认从0开始)组成的元组。

下面是一个使用 enumerate() 函数的简单示例

# 创建一个列表  
fruits = ['apple', 'banana', 'cherry']  # 使用 enumerate() 函数遍历列表  
for index, fruit in enumerate(fruits):  print(f"Index {index}: {fruit}")

输出将会是:

Index 0: apple  
Index 1: banana  
Index 2: cherry

在这个例子中,enumerate(fruits) 为列表中的每个元素生成了一个元组,其中包含元素的索引和值。然后,for 循环将这两个值分别赋值给 index 和 fruit 变量,并打印出来。

如果你想要从1开始计数,而不是默认的0,你可以将 start 参数设置为1:

# 创建一个列表  
fruits = ['apple', 'banana', 'cherry']  # 使用 enumerate() 函数遍历列表,从1开始计数  
for index, fruit in enumerate(fruits, start=1):  print(f"Index {index}: {fruit}")

输出将会是:

Index 1: apple  
Index 2: banana  
Index 3: cherry

这样,enumerate() 函数就可以很方便地在遍历序列的同时获取到元素的索引。

学习碎碎念

总是急着想要一下就成为很厉害的人,但是没有脚踏实地的努力和日复一日的学习都是空想!一步一步的来吧,不一定慢慢来,但要沉下心一步一步的来 。

“请深耕细作自己,长成一帜独树,欣欣浇灌,独当天地。”

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

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

相关文章

【Python】查看指定目录(包括子目录)下指定年份的数量和占用量,附带windows可执行程序。

目录 安装依赖 代码 打包为可执行程序 如果你使用了Anaconda,请先切换环境!!! 安装依赖 pip install tqdm aiofiles 代码 新建一个find.py文件,将以下代码粘贴进去: import os import datetime f…

Linux下进行JavaEE开发-安装JDK、Tomcat、MySQL

目录 JDKTomcatMySQL JDK 安装JDK步骤: 1、创建目录mkdir /opt/jdk 2、将jdk压缩包通过xftp6上传到该目录 3、cd /opt/jdk 4、tar -zxvf jdk-8u151-linux-x64.tar.gz 5、mkdir /usr/local/java 6、mv /opt/jdk/jdk1.8.0_151 /usr/local/java 7、修改环境变量…

Leetcode刷题笔记——数组与字符串篇

Leetcode刷题笔记——数组与字符串篇 一、数组 第一题 Leetcode14:最长公共前缀:简单题 (详情点击链接见原题) 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 "" 当前…

深入学习和理解Java NIO的高级特性

学习使用Path、Paths和Files类来操作文件系统 在Java 7引入的NIO.2(New Input/Output 2)中,Path、Paths和Files类是处理文件系统操作的核心类。它们提供了一套强大的文件I/O操作接口,使得读写文件、访问文件属性、遍历文件目录等…

解锁基于LLMS的咒语:通过上下文学习重新思考对齐

一、写作动机: 最近的一项研究,LIMA,表明仅使用1K个示例进行SFT也可以实现显著的对齐性能,这表明对齐微调的效果可能是“表面的”。(知识和推理能力来源于预训练,而不是必须通过对齐微调获得的。&#xff…

计算机图形学学习(一)——线的绘制、三角形填充绘制

以下摘抄自本人的计算机图形学上机报告 实验内容及要求: 理解并掌握中点画线法、Bresenham算法、扫描线法和重心坐标法的基本原理和算法步骤。使用编程语言C实现上述算法,并编写相应的代码。对于直线绘制算法,要求能够绘制水平、垂直、斜向等…

Python助力:高效合并多个Word文档

目录 写在开头1 准备工作1.1 安装Python环境1.2 安装必要的库 2 理解Word文档的结构2.1 python-docx库的基本使用2.2 文档基本组成2.2.1 段落2.2.2 表格2.2.3 图片2.2.4 页眉和页脚 3 编写合并Word文档的脚本3.1 创建新的Word文档3.2 读取并合并文档内容3.2.1 合并段落3.2.2 合…

【消息队列开发】 实现内存加载

文章目录 🍃前言🌳实现思路🚩读取消息长度🚩读取相应长度的消息🚩进行反序列化🚩判定是否有效🚩加入有效消息🚩收尾工作🚩代码实现 ⭕总结 🍃前言 本次开发目…

未解决的问题:字符数组中元素的个数

情形1&#xff1a; #include<stdio.h> int main() {int arr_int1[10];int arr_int2[]{1,2,3,4,5};char arr_char1[10];char arr_char2[]"world";char arr_char3[]{h,e,l,l,o};int i;i0;while(arr_char2[i]!\0){i;}printf("%d\n",i);i0;while(arr_ch…

mediapipe最小编译、插件开发及demo

mediapipe最小编译、插件开发及demo 1.创建容器2.修改apt源3.安装依赖4.安装conda环境5.安装cmake6.安装bazel7.安装Opencv(非必须)8.下载 mediapipe 0.8.119.编译最简版本的mediapipe10.拷贝编译好的库和头文件11.sample插件的参数12.插件源码13.编译插件14.demo源码15.编译de…

C语言顺序、选择、循环结构与预处理

C语言程序设计&#xff0c;知识一遍过 &#x1f525;温馨提示&#x1f525;&#xff1a;使用电脑端阅读&#xff0c;获取更好体验&#x1f680; 【参考】C 语言教程 | 菜鸟教程 (runoob.com) 文章目录 C语言程序设计&#xff0c;知识一遍过顺序结构表达式语句字符的输入与输出格…

lwip优化任务优先级

在lwIP中&#xff0c;ethernetif_input线程负责接收和处理从以太网接口接收到的数据包&#xff0c;而tcpip主线程则负责处理lwIP协议栈中的各种事件和数据包。一般情况下&#xff0c;ethernetif_input线程的优先级应该设置为低于tcpip主线程的优先级。 这是因为在实时操作系统…

HarmonyOS ArkUI入门—HarmonyOS ArkUI来开发一个健康饮食应用

本文演示如果在DevEco Studio 3里面&#xff0c;用HarmonyOS的ArkUI来开发一个健康饮食应用。体验HarmonyOS 3最新API 9&#xff01; 获取HarmonyOS应用 HarmonyOS的ArkUI来开发一个健康饮食的ArkUI程序“ArkUIHealthyDiet”&#xff0c;基础代码已经有了[1]&#xff0c;个人…

20 OpenCV像素重映

文章目录 像素重映remap 重映算子代码示例 像素重映 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去&#xff0c;形成一张新的图像。 g(x,y)是重映射之后的图像&#xff0c;h(x,y)是功能函数&#xff0c;f是源图像 remap 重映算子 Remap…

Java项目:52 springboot基于SpringBoot的旅游网站的设计与实现013

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 旅游网站主要功能如下&#xff1a; 1.用户管理&#xff1a;注册、登录、退出、修改密码&#xff1b; 2.分类显示&#xff1a;显示旅游路线的分类&am…

MD5算法:密码学中的传奇

title: MD5算法&#xff1a;密码学中的传奇 date: 2024/3/15 20:08:07 updated: 2024/3/15 20:08:07 tags: MD5起源算法原理安全分析优缺点比较技术改进示例代码应用趋势 MD5算法起源&#xff1a; MD5&#xff08;Message Digest Algorithm 5&#xff09;算法是由MIT的计算机…

OpenHarmony教程指南—ArkTS时钟

简单时钟 介绍 本示例通过使用ohos.display 接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI /…

Python QT 之PySide6简单入门

目录 1.开发环境配置 1.1 下载PySide6 2.2 配置pycharm相关快捷方式 PySide6_Designer - QT Designer 设计UI PySide6_UIC - 将QT Designer生成的UI文件转换为python文件 PySide6_RCC - 将RCC文件转换为python文件 2.第一个开发实例 2.1 QT desiger设计界面 2.2 将ui文…

21.AUTOSAR MCAL分析(二):Memory Driver

目录 1. AUTOSAR Memory Driver模块概述 2. Flash Driver 3. EEPROM Driver 4. Flash Test 5. RAM Test 6.小结

一篇普通的生活周记

学习进度汇报&#xff1a; 这周主要是参考着视频敲完了一个vue2后台项目&#xff0c;主要是vue2element-ui,因为之前写项目的时候用过lay-ui&#xff0c;虽然是结合着node.js写的&#xff0c;但是大差不差&#xff0c;所以上手也很快。同时&#xff0c;学长发给我们了ruoyi项目…