贪心算法(活动选择、分数背包问题)

news2024/11/16 11:57:01

一、贪心算法

        贪心算法是指:在对问题求解时,总是做出在当前看来是最好的选择,而不从整体最优考虑,做出的仅是在某种意义上的局部最优解。                                                                                            贪心算法不是对所有问题都能得到整体最优解,但能产生整体最优解或者其近似解

        基本思路:

        通过一种贪心的想法,使得得到当前的局部最优解,从而拓展至整体最优解(不一定)。所求问题的整体最优解可以通过一系列局部最优的选择,换句话说,当考虑做何种选择的时候,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。这是贪心算法可行的第一个基本要素。贪心算法以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

        贪心算法的弊端: 

              1.不能保证得到的最后解一定是最佳的,可能存在近似解(不保证一定的正确)。

              2.不能用来求最大或最小解问题。

              3.只能求满足某些约束条件的可行解的范围。

二、活动选择问题

        1.题目描述:

    假定有一个n个活动(activity)的集合S={a1, a2, ..., an},这些活动使用同一个资源(例如一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。 每个活动ai都有一个开始时间si和一个结束时间fi。 如果两个活动[si, fi)和[sj, fj)不重叠,则称它们是兼容的

        目标: 找到互相兼容的最大活动子集

        互相兼容的最大活动子集样例:

   

            2.贪心思想的策略

                针对每个新活动,计算其与已经举办过的活动之间的兼容性。

                ①最早启动优先:对于所有活动,以 si 升序排列

                ②最短时长优先:以 fi - si 升序排列

                ③最少冲突优先:对于每个 i,统计与其冲突的活动数量 ci ,以 ci  升序排列

                ④最早结束优先:以 fi 升序排列

        贪心算法不保证正确性,以上四种想法,对于 ① ② ③ 均存在反例验证出其错误。

        3.贪心思想的正确性验证(最早结束优先): 

        设E={a1,a2,.....,an}为活动集合,且E中的活动是按照活动结束时间升序排列的,显然a1为最早结束。设A是问题的一个最优解,明显A是E的一个子集,设A的第一个活动为k

        ① 若 k = a1,则A的第一个活动就是最早结束的,故A是以贪心选择开始的最优解

        ② 若 k ≠ a1,设集合B=(A-{k})∪a1 ,即用活动a1可替换掉活动k

        因为a_{1}的结束时间小于k,故a_{1}k提前结束。另外由于A中的活动是相容的,故B中的活动也相容。      又因为A中的活动个数和B中的活动个数相同,故B也是最优解(需要注意的是最优解一般不唯一)。所以 B 是一个以贪心选择活动 a1 为开始后的最优解。

        或者另一种想法:

        对于最早结束的第一个活动 a1, 局部最优解考虑a1,再考虑 a2 :

         若 s2>f1 a1,a2 兼容,则问题只需要考虑 a2 ~ an,问题变成了子问题 a2 ~ an 。

         若 s2<f1  a1,a2 冲突,不考虑 a1, 令 a2 为最优解的第一个活动,则此时在 a3~an 的最优解中,加上 a1 或者 a2 的活动(不冲突时),才成为整体的最优解。此时考虑 a1 或者 a2 都是最优解,活动兼容的个数都相同,所以此贪心思想是正确的。

        4. 此外该问题还存在另一种贪心思想:

        选择最晚开始的活动依次排序考虑,其他与上述思想一致。

三、拓展问题:最少资源投入

        1.问题描述

        假定有一个n个活动的集合S={a1, a2, ..., an},这些活动可以同时使用多个资源(例如一个阶梯教室),但一个资源在某个时刻只能供一个活动使用。 每个活动 ai 都有一个开始时间 si 和一个结束时间 fi 。 如果两个活动 [ si ,  fi ) 和 [ sj , fj ) 不重叠,则称它们是兼容的

        目标: 找到最少资源数量,使得所有活动能够正常举行.

         2.贪心思想:

        ①首先将所有课程按照开始时间升序排列,并且将每门课程赋予任何可兼容的教室。

        ②通过维护一个优先队列,按照结束时间升序排列(队列首端的结束时间最早),队列中的每个元素对应着各教室的结束时间。

        ③这样当新的一个活动加入时,只需要与队首元素对应的结束时间比较,若大于结束时间则直接替换,若小于最早的结束时间,则需要加入一个元素(添加一个新的教室)

四、分数背包问题

       1.问题描述 

        给定背包容量和一些物品,每个物品有重量和价值两个属性。允许只取一个物品的一部分加入背包,求问如何才能使背包装的物品价值最大。

背包问题实质上是一个线性规划问题,可以用单纯形法、椭球法、内点法(后两者均为多项式时间算法)等求解。但在这个问题中,简单的贪心算法就能够求出最优解。

        2.贪心思想:

        既然能够取某个物品的一部分加入背包,则可以先计算出每个物品的单位重量对应的价值再从高到低依次排序,依次放入背包,直至达到背包的总容量(贪心)。

        即先取最划算的,从最划算的依次往下取。

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

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

相关文章

[C++基础学习-07]----C++结构体详解

前言 结构体&#xff08;Struct&#xff09;是C中一种用户定义的复合数据类型&#xff0c;用于存储不同类型的数据项。结构体可以包含不同类型的数据成员&#xff0c;这些数据成员可以是基本类型&#xff08;如int、float、char等&#xff09;&#xff0c;也可以是数组、指针、…

【莫比乌斯变换-04】求解莫比乌斯变换系数

求解莫比乌斯变换系数 文章目录 一、说明二、如何确定双线性变换系数2.1 变换基本形式2.2 通过三点确定 三、一般情况的变换3.1 最简单的情况&#xff1a;无穷大3.2 处理无穷大 四、Python 代码 一、说明 上一篇文章是对双线性变换的视觉介绍&#xff0c;又名莫比乌斯变换或分…

刷代码随想录有感(56):二叉搜索树的最小绝对差

题干&#xff1a; 代码:中序遍历成有序数组逐一比较相邻两个数之间的差值&#xff0c;注意这里是取最小值所以定义的初始值应该是非常大的INT_MAX&#xff01;&#xff01;&#xff01; class Solution { public:void traversal(TreeNode* root, vector<int>&a){if(…

tomcat+maven+java+mysql图书管理系统2-完善项目结构,添加相关依赖

1.创建java目录 接着选择java&#xff0c;回车&#xff0c;则创建成功&#xff0c;成功后在左侧栏能看见 2.修改pom.xml文件,(添加依赖) <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

iTOP-4412-裸机开发(环境搭建)

实验平台 ①SOC型号&#xff1a;samung Exynos 4412 ②使用软件&#xff1a;DNW v0.6C - For WinCE ③硬件平台&#xff1a;iTOP-4412 ④window版本&#xff1a;window10-64位 备注&#xff1a;此文章只有环境搭建部分。 版权声明 ①作者&#xff1a;coLin ②声明&#…

仿知乎网站问答源码,开源版

仿知乎网站问答源码&#xff0c;开源版 需要一定动手能力 发文章&#xff0c;发视频&#xff0c;发想法&#xff0c;提问回答&#xff0c;注册登录 开发环境 使用技术&#xff1a;springbootthymeleafRedis&#xff1b; 开发环境&#xff1a;tomcat8.0&#xff0c;jdk8.0, ID…

图神经网络GNN的表达能力

回顾 图卷积神经网络GCN GNN概要 神经网络的表达能力 分类or回归 神经网络的表达能力举例&#xff1a; 深度学习的理论基础和上限 GNN的表达能力 定义&#xff1a;图神经网络的表达能力就是它区分不同图的区分能力 分析常见的GNN的表达能力并设计出表达能力最强的GN…

使用FPGA实现串-并型乘法器

介绍 其实我们知道&#xff0c;用FPGA实现乘法器并不是一件很简单的事&#xff0c;而且在FPGA中也有乘法器的IP核可以直接调用&#xff0c;我这里完全就是为了熟悉一些FPGA的语法然后写了这样一个电路。 串-并型乘法器模块 从字面上看&#xff0c;串-并乘法器就是其中一个乘数…

电磁波的极化形式

极化是电磁波的一个固有属性,是指电磁波的电场矢量末端的轨迹曲线,电磁波的极化 状态由这条曲线所决定,电场的振动方向称为极化方向,极化方向与传播方向共同构成了极 化面。在通信链路中,只有接收机天线与被接收信号的极化形式匹配时,才能有效的接收信号,如果接收机天线…

STM32 串口IDLE接收空闲中断+DMA

参考 http://t.csdnimg.cn/fAV38 1.基础知识 STM32 IDLE 接收空闲中断 功能&#xff1a; 在使用串口接受字符串时&#xff0c;可以使用空闲中断&#xff08;IDLEIE置1&#xff0c;即可使能空闲中断&#xff09;&#xff0c;这样在接收完一个字符串&#xff0c;进入空闲状态时&…

OpenCV(五) —— 人脸识别模型训练与 Windows 下的人脸识别

本文主要内容&#xff1a; 如何训练 OpenCV 的人脸识别模型如何在 Windows 下利用 OpenCV 进行人脸识别 1、概述 人脸识别需要人脸模型&#xff08;特征集合&#xff09;的支持&#xff0c;人脸定位的速度与准确度取决于模型。 OpenCV 提供了已经训练好的模型&#xff0c;无…

RK3568平台(基础篇)linux错误码

一.概述 linux应用程序开发过程中&#xff0c;经常会遇到一些错误信息的返回&#xff0c;存在的可能性有&#xff0c;参数有误、非法访问、系统资源限制、设备/文件不存在、访问权限限制等等。对于这类错误&#xff0c;可以通过perror函数输出具体描述&#xff0c;或者通过str…

轨道交通巡检机器人的应用范围

在现代轨道交通系统的庞大网络中&#xff0c;无数的轨道、设备和设施交织在一起&#xff0c;如同一个精密的机器在高效运转。而在这背后&#xff0c;轨道交通巡检机器人正悄然登场&#xff0c;它们如同一个个智能的守护者&#xff0c;穿梭于各个场景之中。那么&#xff0c;这些…

2. 深度学习笔记--损失函数

在机器学习中&#xff0c;损失函数是代价函数的一部分&#xff0c;而代价函数则是目标函数的一种类型。 Loss function&#xff0c;即损失函数&#xff1a;用于定义单个训练样本与真实值之间的误差&#xff1b; Cost function&#xff0c;即代价函数&#xff1a;用于定义单个批…

富文本编辑器CKEditor4简单使用-08(段落首行缩进插件 + 处理粘贴 Microsoft Word 中的内容后保持原始内容格式(包括首行缩进))

富文本编辑器CKEditor4简单使用-08&#xff08;段落首行缩进插件 处理粘贴 Microsoft Word 中的内容后保持原始内容格式&#xff08;包括首行缩进&#xff09;&#xff09; 1. 缩进&#xff0c;特殊方式处理——修改原工具栏里的增加缩进量2 缩进&#xff0c;插件处理2.1 下载…

【Java基础】Maven的生命周期(clean+site+default)

1. 前言 在 Maven 出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试及部署&#xff0c;但由于没有统一的规范&#xff0c;不同公司甚至不同项目之间的构建的方式都不尽相同。 Maven 从大量项目…

ES集群数据备份与迁移

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、文章涉及概念讲解二、操作步骤1.创建 snapshot repository操作主机hadoop1分别操作从机hadoop2和hadoop3 2. 查看仓库信息3. 备份索引&#xff0c;生成快照…

k8s Dashboard 运维维护记录

k8s Dashboard 运维维护记录 k8s Dashboard 运维维护记录 Q1&#xff1a;需要使用firefox浏览器访问 提示了证书错误NET::ERR_CERT_INVALID&#xff0c;原因是由于物理机的浏览器证书不可用 需要注意的是&#xff0c;若提示“连接不安全”的警告时&#xff0c;点击“高级”…

2024新蓝海项目 零门槛高收益持续稳定 纯手机操控 单日盈利3000 新手当日入门

这个项目具有极高的稳定性&#xff01;通过积累的里程积分&#xff0c;我们可以以较低的成本获取机票。然后&#xff0c;我们以远低于官方网站的价格出售这些机票&#xff0c;从而获得利润。随着我们经营的时间增长&#xff0c;我们积累的客户群体也会越来越大。 项目 地 址 …

游戏AI的智能化:机器学习在虚拟生命中的应用

文章目录 写在前面游戏AI的智能化&#xff1a;机器学习在虚拟生命中的应用游戏内容的自动化创作&#xff1a;机器学习的革新性应用玩家体验的个性化优化&#xff1a;机器学习的定制化力量未来展望&#xff1a;机器学习塑造游戏行业新纪元游戏AI的智能化发展自动化内容生成的革命…