算法与数据结构高手养成:朴素的贪心法(上)最优化策略

news2024/11/16 0:37:54


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭
~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:算法与数据结构高手养成

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录​​​​​​​

朴素的贪心法(上)最优化策略

常见贪心法归类

何为“朴素”贪心

最优化策略:取石子

取石子(改)

最优化策略适用条件

最优化策略:分析步骤

例题:机器工厂(USACO)​

步骤1:划分阶段和决策

步骤2:验证最优子结构/无后效性

步骤2.5:修改决策

步骤2.5:重新验证最优子结构/无后效性

步骤3:最优化策略

步骤3:最优化策略(改进)​

代码:机器工厂(C++)


朴素的贪心法(上)最优化策略

常见贪心法归类

1.最优化策略——每一次都采用当前最优决策

2.构造法——通过总结和归纳找到规律,直接推导出答案

3.二分答案——通过答案反推,验证合法性从而确定最优解

何为“朴素”贪心

  • 所谓“朴素”,就是可以通过确定性的贪心步骤得出最优解

  • 有些问题很难通过确定性贪心步骤得到最优解,但可以通过在贪心时加入随机因素(不是每次都选最优策略,而是几种较好策略中随机选择一种),来得到近似最优解

  • 当随机次数足够多时,这个近似最优解就会无限逼近最优解这个方法称为随机贪心法,后续会

最优化策略:取石子

每次都选取最大~

取石子(改)

由于条件限制,不能做到每次都拿最多,如果第一次拿3,第二次拿4时,第三次就不能再拿了

不适用贪心,但动态规划可解

最优化策略适用条件

第一,有明确的阶段,且每个阶段的决策都很清晰

  • 阶段一定是按顺序执行的

  • 对于第K(1≤K≤N)个阶段,前K轮的最优决策集合称为局部最优解当K=N时,称为全局最优解

第二,一个阶段的局部最优解,一定是从前面阶段的局部最优解得到的,这个特性称之为最优子结构

  • 例:取石子里,第二轮如果取4,那么无论第三轮取什么,总数一定不是最多。只有第二轮取5(局部最优解)第三轮才有可能产生总数最多的情况

  • 反例:取石子(改)里,第二轮取5是当前最优,但第三轮取4是最优。只有第二轮不取当前最优时,第三轮才能取到最优——不适用贪心法

第三,后面阶段的决策,不会影响到前面阶段的决策,这个特性称为无后效性

  • 例:无论第二轮取哪一堆,都不影响第一轮取的石子

  • 反例:题目修改为“每种数目的石子只能取一次,比如这一次取了5个,下一次就不能再取5个”——后面选择跟前面冲突的话,就需要返回修改之前的选择

最优化策略:分析步骤

1.划分问题的阶段决策

2.验证最优子结构无后效性

3.通过比较和判断,确定每一步的最优策略

例题:机器工厂(USACO)

步骤1:划分阶段和决策

  • 阶段:周数 K(1 ≤K≤ N)

  • 决策:第 K周生产多少台机器

步骤2:验证最优子结构/无后效性

  • 无后效性:满足

  • 因为第 K 周生产几台都不影响第1~K-1周的交付(不可能后面生产的穿越回去交付前面的订单)

  • 最优子结构呢?

局部最优解定义:完成前 K周订单的总成本最小(K=N)时就是全局最优解 在这个定义下,局部最优解一定是刚好满足K周订单需求即可不会额外生产供以后交付,否则会浪费

不满足最优子结构?

步骤2.5:修改决策

  • 问题出在决策:不能只满足本周的需求而不考虑后续需要

  • 反向思考1:本周要交付的机器可以是本周生产,也可以是之前生产

  • 反向思考2:不管前面是哪周生产,成本都可以直接算出来(等于该周生产成本+储藏成本x周数差)

例:前三周每个机器生产成本分别是1,5,6,储藏成本是2

第三周要交付的机器如果在当周生产,成本是6,如果要在第二周生产,成本是5+2x1=7;如果要在第一周生产,成本是1+2x2=5

所以,第三周交付的机器,在第一周生产最省钱

步骤2.5:重新验证最优子结构/无后效性

  • 决策修改为:第K周要交付的机器应该在第几周生产

  • 无后效性仍然满足

  • 最优子结构也满足:前K周总成本最低的情况,一定是从前K-1周总成本最低的情况推出来的

步骤3:最优化策略

  • 对于第K周,计算本周交付的机器在第i(1≤i≤K)周生产并储藏到第K周,分别所需要的成本

  • 选择成本最低的一周,由它来生产第K周需要交付的订单

  • 将这个最低的成本加上前K-1周的最低总成本,得到前K周的最低总成本(局部最优解)。K=N时得到的就是最终答案

虽然问题解决了,但是这个方法的效率还有提升空间

决策时,选择某一成本最低的一周的时候,我们刚刚采用的策略是挨个计算出每一周的成本,从而选择最小的,涉及了很多重复计算,成本的变化是有一定规律的,并不需要每次都进行计算~

步骤3:最优化策略(改进)

直接把时间复杂度降低了一个数量级~时间复杂度对O(n)

代码:机器工厂(C++)

    int n, s; // 声明变量n和s,分别表示总共的星期数和保养一台机器的费用
    cin >> n >> s; // 输入总星期数和保养费用
    int p, y, min_p = INT_MAX - s; // 声明变量p、y和min_p,min_p初始化为INT_MAX-s,用来存放当前最小的生产成本
    long long total = 0; // 声明变量total用来存放总花费
    for (int i = 0 ;i < n; i++) // 循环n次,表示n个星期
    {
        cin >> p >> y; // 输入当前星期生产一台机器的成本p和订单数量y
        min_p = min(min_p + s, p); // 对当前最小成本进行更新,考虑了保养费用
        total += min_p * y; // 计算当前星期的总花费,加上当前最小成本乘以订单数量
    }
    cout << total << endl; // 输出总花费

    return 0;

​​

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

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

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

相关文章

Linux离线一键安装Docker及docker-compose环境

背景&#xff1a; 在当前软件部署运维环境中由于Docker容器化优势越来越明显&#xff0c;因些被许多公司运维所采用&#xff0c;那首先如何快速安装Docker及docker-compose基础环境就第一时间被人们关注&#xff0c;本人同样在经过多次手工逐条用命令安装的过程&#xff0c;整理…

继承--5.29

继承格式&#xff1a; package javatest2;public class people {int age;double workday;public people(int age, double workday) {this.age age;this.workday workday;} }package javatest2;public class student extends people {int studyday;public student(int age, d…

使用目标检测模型YOLO V9 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

我看到YOLO V8中&#xff08;ultralytics版本8.2.18&#xff09;集成了YOLO V9&#xff0c;所以直接在YOLO V8 OBB的基础上实现YOLO V9 OBB&#xff0c;训练结果也出来了&#xff0c;但是评估指标比YOLO V8 OBB低一点点&#xff0c;不知道是不是哪里遗漏修改了......如有大神赐…

开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述

1. 文档管理系统是什么 文档管理系统&#xff08;DMS&#xff1a;Document Management System&#xff09;是一种软件系统&#xff0c;用于组织、存储、检索和管理电子文档和文件。这些文件可以是各种格式的电子文档&#xff0c;如文本文档、电子表格、图像、音频或视频文件等…

easy-rule规则引擎使用

简介 轻量级的规则引擎&#xff0c;易于学习的api 简单来说&#xff0c;规则引擎就是一个函数&#xff1a;yf(x1,x2,…,xn) 将业务代码和业务规则分离&#xff0c;解耦业务决策和业务代码的绑定关系 入门示例 依赖引入 <dependency><groupId>org.jeasy</grou…

3dmax渲染经常卡主?关掉光追即可流畅渲染

3ds Max是一款广泛应用于三维建模、动画和渲染的软件&#xff0c;它在影视、游戏、建筑可视化等领域具有重要地位。在3ds Max中&#xff0c;渲染技术的选择和应用直接影响到最终图像的质量和渲染效率。 但在实际使用过程中&#xff0c;由于3dsMax中有太多选项&#xff0c;很多…

一文看懂!电磁仿真软件CST Studio Suite的技术发展历程

CST工作套件室是一款功能强大、专业级别的软件包&#xff0c;用于进行微波无源器件和天线的仿真分析和设计。它支持的应用领域包括耦合器、滤波器、环流器、隔离器、谐振腔、平面结构、连接器、电磁兼容、集成电路封装以及各种类型的天线和天线阵列。该软件可以提供必要的S参数…

【C++】:vector容器的底层模拟实现迭代器失效隐藏的浅拷贝

目录 &#x1f4a1;前言一&#xff0c;构造函数1 . 强制编译器生成默认构造2 . 拷贝构造3. 用迭代器区间初始化4. 用n个val值构造5. initializer_list 的构造 二&#xff0c;析构函数三&#xff0c;关于迭代器四&#xff0c;有关数据个数与容量五&#xff0c;交换函数swap六&am…

【机器学习-k近邻算法-01】 | Scikit-Learn工具包进阶指南:机器学习sklearn.neighbors模块之k近邻算法实战

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

ubuntu下载离线软件包及依赖

目录 一、前言 二、正文 1.准备环境 2.开始下载 3.后续工作 三、总结 一、前言 由于给客户提供的设备机不允许上网&#xff0c;那么所有待安装的软件包及依赖库都需要提前下载好&#xff0c;然后通过局域网传过去再安装。 另外&#xff0c;软件包可能还依赖其他的库&…

AI大模型给稀土产业带来什么

近日&#xff0c;在包头市金蒙汇磁材料有限责任公司成品自动检验车间&#xff0c;三台AI大模型质检机器人正在紧张工作着&#xff0c;随着光电的闪烁&#xff0c;电子屏上不断更新着相关信息&#xff0c;一批批磁钢产品很快完成检测。 技术人员查看大模型质检设备上的检测信息 …

Jetpack架构组件_4. 数据绑定库页面传递数据

本篇介绍数据源从activity_main&#xff08;1级页面&#xff09;传递给include布局&#xff08;2级页面&#xff09;。 1.实现步骤 step1.修改build.gradle文件 修改app模块下的build.gradle文件&#xff0c;增加如下内容&#xff1a; dataBinding {enabled true} step2.创建…

WPF之TextBlock文本标签

TextBlock: 用于显示文本内容 常用属性 Text设置展示的文本fontsize设置字体大小FontWeight设置字体粗细FontFamily设置字体样式 实例 <Grid><TextBlock Text"显示文本"FontSize"10"FontWeight"Bold"Foreground"red">&l…

【机器学习300问】105、计算机视觉(CV)领域有哪些子任务?

计算机视觉作为人工智能的重要分支&#xff0c;发展至今已经在诸多领域取得显著的成果。在众多的计算机视觉任务中&#xff0c;图像分类、目标检测与定位、语义分割和实例分割是四个基本而关键的子任务&#xff0c;它们在不同的应用场景下扮演着重要角色。这四个子任务虽然各具…

Neovim 配置全面解析(下)

Neovim 配置全面解析&#xff08;下&#xff09; 原文&#xff1a;Neovim 配置全面解析&#xff08;下&#xff09; - 知乎 (zhihu.com) 环境&#xff1a;Ubuntu 20.04 宿主机&#xff1a;windows &#xff08;windows terminal&#xff09;WSL 2 NVIM&#xff1a;v 0.10.0-de…

是如何学习 Java 的?

我曾在携程旅行网做 Java 开发&#xff0c;也曾拿过阿里 P7 offer 和饿了么、美团等公司的 offer&#xff0c;这是职位都是 Java 开发岗&#xff0c;也做过 Java 面试官面试过不少同学。下面我就和大家分享一下我学习 Java的经验。 我将从 Java 基础知识、Java 框架、计算机基…

Java设计模式 _行为型模式_备忘录模式

一、备忘录模式 1、备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型模式。通过保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象。 2、实现思路 &#xff08;1&#xff09;、定义记录数据的格式规范。 &#xff08;2&#xff09;、编…

计算机算法中的数字表示法——原码、反码、补码

目录 1.前言2.研究数字表示法的意义3.数字表示法3.1 无符号整数3.2 有符号数值3.3 二进制补码(Twos Complement, 2C)3.4 二进制反码(也称作 1 的补码, Ones Complement, 1C)3.5 减 1 表示法(Diminished one System, D1)3.6 原码、反码、补码总结 1.前言 昨天有粉丝让我讲解下定…

SRE视角下的DevOps构建之道

引言&#xff1a; 随着数字化时代的飞速发展&#xff0c;软件成为了企业竞争力的核心。为了更高效地交付高质量的软件&#xff0c;DevOps&#xff08;Development和Operations的组合&#xff09;作为一种文化、实践和工具集的集合&#xff0c;逐渐成为了行业内的热门话题。然而…

怎样快速查找网页代码中存在的错误?

计算机很机械&#xff0c;代码中存在微小的错误&#xff0c;计算机就得不到正确的运行结果。比如&#xff0c;一个字母的大小写、比如&#xff0c;个别地方丢掉了一个符号、、、如此等等。这就要求程序员和计算机是心灵相通的&#xff0c;不能有任何的“隔阂”。 但是&#xf…