数据结构与算法之贪心动态规划

        一:思考

        1.某天早上公司领导找你解决一个问题,明天公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束 时间,你怎么样安排才能使会议室最大利用?即安排最多场次的会议?电影的话 那肯定是最多加票价最高的,入场率。综合算法

        2.双十一马上就要来了,小C心目中的女神在购物车加了N个东西,突然她中了一个奖可以清空购物车5000元的东西(不能找零),每个东西只能买一件,那么她应该如何选择物品使之中奖的额度能最大利用呢?如果存在多种最优组合你只需要给出一种即可,嘿嘿 现在女神来问你,你该怎么办?(动态规划)

        二: 贪心算法

        概念:贪心算法又叫做贪婪算法,它在求解某个问题是,总是做出眼前最大利益。 也就是说只顾眼前不顾大局,所以它是局部最优解。核心点:通过局部最优推出全局最优

        举例:

        1.某天早上公司领导找你解决一个问题,明天公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束时间,你怎么样安排才能使会议室最大利用?即安排最多场次的会议?

         现在我们怎么去贪?也就这个我们选择的贪心策略:、

         1.1 选时间最短:1-3,2~4,3~5,4~6

        1.2 按结束时间从小到大排序:首先把第一个加入我们可以开会的列表。之后只要开始时间是大于我们上一个的结束时间的就可以开 (代码如下)

package tx;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** 贪心算法:1.某天早上公司领导找你解决一个问题,明天公司有N个同等级的会议需要使用同一个会议室,* 	现在给你这个N个会议的开始和结束时间,你怎么样安排才能使会议室最大利用?即安排最多场次的会议?** 	策略:按结束时间从小到大排序:首先把第一个加入我们可以开会的列表。之后只要开始时间是大于我们上一个的结束时间的就可以开* 	核心:排序*/
class Metting implements Comparable<Metting> {int meNum; // 编号int startTime; // 开始时间int endTime; // 结束时间public Metting(int meNum, int startTime, int endTime) {super();this.meNum = meNum;this.startTime = startTime;this.endTime = endTime;}public int compareTo(Metting o) {if (this.endTime > o.endTime)return 1;return -1;}@Overridepublic String toString() {return "Metting [meNum=" + meNum + ", startTime=" + startTime+ ", endTime=" + endTime + "]";}}public class MettingTest {public static void main(String[] args) {Scanner cin = new Scanner(System.in);List<Metting> mettings = new ArrayList<Metting>();int n = cin.nextInt();	//n个会议for (int i = 0 ;i < n; i++){int start = cin.nextInt();int end = cin.nextInt();Metting metting = new Metting(i+1, start, end);mettings.add(metting);}mettings.sort(null);int curTime = 0;		//当前的时间,从一天的0点开始,如果领导要求从8点开始 那curTime=8for(int i = 0 ; i < n; i ++){Metting metting = mettings.get(i);if(metting.startTime >= curTime){		//会议的开始时间比我们当前的要大 表示可以开System.out.println(metting.toString());curTime = metting.endTime;}}}
}

         2.1 贪心算法的核心思想

        贪心算法的套路:一定会有一个排序。哈夫曼编码,贪心算法,压缩算法。最短路径

        贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

         贪心算法其最重要的两个点就是: 贪心策略排序

通过局部最优解能够得到全局最优解

一般通过以下问题就可以通过贪心算法解决:

                1.针对某个问题有限制值,以及有一个期望的最好结果,通常是从某些数据中选出其中一些,达到最好的结果。

                2.一般会有一个排序,找出贡献最大的。

                3.举例看贪心是否可以解决。 一般用在任务调度,教师排课等系统。 实际上,用贪心算法解决问题的思路,并不总能给出最优解。

        三:动态规划

        经典问题

        背包问题 小偷去某商店盗窃,背有一个背包,容量是5kg,现在有以下物品(物品不能切分,且只有一个),请问小偷应该怎么拿才能得到最大的价值?

5kg的袋子

物品:

钱:6  10  12

Kg:1  2   4

思路:我们把5kg的袋子,拆分成1kg,1kg这样子计算,里面的表格就表示当前重量下能装的最多的钱。表格的数列就表示是要装的物品

1kg

2kg

3kg

4kg

5kg

加入物品1

6

6

6

6

6

加入物品2

6

10

10+6=16

10+6=16

16

加入物品3

6

10

16

16

18

第一个物品: 袋子只能装1kg的物品,所以价钱为6

第二个物品: 

        袋子当前为1kg 的容量时,我们发现物品2装不进去。那我们应该取多少呢?是不是只要取物品进来时1kg最大钱?

        当袋子为2kg时,我们发现物品2可以装下去,此时可以得到10块钱,之前物品1进来时2kg最大是6吧,那我们肯定要选择大的这个10,而不是6.此时袋子还剩0kg可以装。

        袋子为3kg时,我们还是可以装下这个物品2,得到10块,袋子还剩下1kg。

10+1kg能装的东西。

第三个物品:

        袋子为4kg时,物品3可以转进来,得到12块钱,袋子还剩0kg。

        我发现我不装物品3 还能得到16呢

        袋子为5kg时,物品3可以转进来,得到12块钱,袋子还剩1kg。那么装了物品3就能得到12+6=18块钱

        我发现我不装物品3 能得到16,比18小,所以决定装.。

                                (图解:将数值除以10就是上面的题)

                代码实现

package tx;public class Dp {public static void main(String[] args) {int value [] ={60,100,120};int weigth[] = {10,20,40};	//购物车那个问题 只需要一个价值就行了,重量都都没有。int w = 50;  //代表我可以装的数量int n = 3; //代表三个物品int dp[][] = new int[n+1][w+1];		//n表示是物品,w表示重量,初始化全是0for(int i = 1; i<= n; i++){	//每次加的物品for(int cw = 1 ; cw <= w ; cw ++){		//分割的背包if(weigth[i - 1] <= cw){		//表示这个物品可以装进去dp[i][cw] = Math.max(value[i-1] + dp[i-1][cw-weigth[i-1]],dp[i-1][cw]);}else{dp[i][cw] = dp[i-1][cw];	//不能装}}}System.out.println(dp[n][w]);}
}

四:动归和贪心的比较        

        贪心是只管眼前不会管后的情况,而动归不一样,它的每次递推都是基于上一次的最优解进行。所以往往动归是一定能求出最优解的,而贪心不一定,这也是贪心算法的缺点,但是大家都看到了动归的时间复杂度是O(n*m)而贪心是O(nlogn),所以贪心算法的是高效的,动归如果子问题太多的话 就容易算不出结果,而且能用动归的问题往往用贪心都能解决一部分,甚至很大一部分。因此如果在实际项目中要求不是特别严的话 我建议使用贪心算法求最优解,其实我们很多时候并不用保证100%的准确,能尽量准确就可以了,贪心恰恰是符合这个规则的。

        五:购物车代码实现

package tx;public class CardDp {public static void main(String[] args) {int weigth[] = {1,2,3,4,5,9};	//购物车那个问题 只需要一个价值就行了,重量都都没有。int w = 8;int n = 6;int dp[][] = new int[n+1][w+1];		//n表示是物品,w表示重量,初始化全是0for(int i = 1; i<= n; i++){	//每次加的物品for(int cw = 1 ; cw <= w ; cw ++){		//分割的背包if(weigth[i - 1] <= cw){		//表示这个物品可以装进去dp[i][cw] = Math.max(weigth[i-1] + dp[i-1][cw-weigth[i-1]],dp[i-1][cw]);}else{dp[i][cw] = dp[i-1][cw];	//不能装}}}System.out.println(dp[n][w]);}
}

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

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

相关文章

高等数学教材重难点题型总结(四)不定积分

难点在于量级&#xff0c;不定积分一定要多练多见才能游刃有余~ 1.利用求导公式验证等式 2.计算不定积分

C语言——指针完全版

目录 一、指针的运算 1.1指针 - 整数 1.2指针 - 指针 二、指针遍历数组 2.1指针遍历数组 1.了解数组名称的含义&#xff08;&数组名和数组名的区别&#xff09;。 2.用指针遍历数组 三、指针数组、数组指针、函数指针 3.1指针数组 3.1.1指针数组的形式 3.1.2指针…

【力扣每日一题】2023.9.7 修车的最少时间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数值&#xff0c;数组里每个元素表示一个老师傅&#xff0c;老师傅修车花费的时间等于数值乘上车辆数的平方。 问我们修理…

编程语言排行榜

以下是2023年的编程语言排行榜&#xff08;按照流行度排序&#xff09;&#xff1a; Python&#xff1a;Python一直以来都是非常受欢迎的编程语言&#xff0c;它简洁、易读且功能强大。在数据科学、机器学习、人工智能等领域有广泛应用。 JavaScript&#xff1a;作为前端开发…

idea:java: Compilation failed: internal java compiler error

java: Compilation failed: internal java compiler error错误 检查下面2个即可&#xff1a;

docker 生成镜像的几个问题

docker 生成镜像的几个问题 根据jdk8.tar.gz 打包Jdk8 镜像失败运行镜像报错差不多是网络ip错误,在网上说重启docker即可解决运行mysql5.7.25 镜像失败向daemon.json文件添加内容导致docker重启失败docker run 命令常用参数根据jdk8.tar.gz 打包Jdk8 镜像失败 首选做准备工作…

卡牌类游戏推荐,卡牌类三国手游排行榜

以下是小编要推荐给大家的关于卡牌类三国手游排行榜的内容。这里有来自各个历史阶段的名将和美女&#xff0c;让你体验最真实的三国战役。你可以将各种战略思维运用到其中&#xff0c;感受步步为营的喜悦&#xff0c;最终赢得战火纷飞的三国&#xff0c;如果想了解每个游戏的具…

浅谈安科瑞ADL200仪表在爱尔兰工厂的应用

摘要&#xff1a;用户端消耗着整个电网80%的电能&#xff0c;用户端智能化用电管理对用户可靠、安全、节约用电有十分重要的意义。构建智能用电服务体系&#xff0c;推广用户端智能多功能仪表、智能用电管理终端等设备用电管理解决方案&#xff0c;实现电网与用户的双向良性互动…

失效的访问控制及漏洞复现

文章目录 渗透测试漏洞原理失效的访问控制1. 失效的访问控制1.1 OWASP TOP 101.1.1 A5:2017-Broken Access Control1.1.2 A01:2021-Broken Access Control 1.2 失效的访问控制类别1.2.1 水平越权1.2.2 垂直越权 1.3 攻防案例1.3.1 DVWA越权 1.4 相关漏洞1.4.1 目录遍历1.4.2 未…

【Redis】Bitmap 使用及应用场景

前言&#xff1a;bitmap 占用空间小&#xff0c;查询效率高&#xff0c;在一些场景中使用 bitmap 是一个很好的选择。 一、bitmap 相关命令 SETBIT - 设置指定位置的比特值&#xff0c;可以设为 1 或 0 例如 SETBIT key 10 1&#xff0c;将在 key 对应的 bitmap 中第10位设置为…

explain 实战-----查看hive sql执行计划

目录 1.join/left join/full join 语句会过滤关联字段 null 的值吗&#xff1f; &#xff08;1&#xff09;join &#xff08;2&#xff09; left join /full join 2.group by 分组语句会进行排序吗&#xff1f; 1.join/left join/full join 语句会过滤关联字段 null 的值吗…

【java】【SSM框架系列】【一】Spring

目录 一、简介 1.1 为什么学 1.2 学什么 1.3 怎么学 1.4 初识Spring 1.5 Spring发展史 1.6 Spring Framework系统架构图 1.7 Spring Framework学习线路 二、核心概念&#xff08;IoC/DI&#xff0c;IoC容器&#xff0c;Bean&#xff09; 2.1 概念 2.2 IoC入门案例 …

CH06_第一组重构(上)

提取函数&#xff08;Extract Function |106&#xff09; 曾用名&#xff1a;提炼函数&#xff08;Extract Function&#xff09; 反向重构&#xff1a;内联函数&#xff08;115&#xff09; 示例代码 function printOwing(invoice) {printBanner();let outstanding calcul…

API安全学习 - crAPI漏洞靶场与API测试思路

crAPI漏洞靶场与解题思路 1. 前置基础1.1 认识crAPI1.2 环境搭建1.3 API的分类与鉴别 2. 漏洞验证2.1 失效的对象级别授权挑战1&#xff1a;访问其它用户车辆的详细信息挑战2&#xff1a;访问其它用户的机械报告 2.2 失效的用户身份验证挑战3&#xff1a;重置其它用户的密码 2.…

NIFI实现JSON转SQL并插入到数据库表中

说明 本文中的NIFI是使用docker进行安装的&#xff0c;所有的配置参考&#xff1a;docker安装Apache NIFI 需求背景 现在有一个文件&#xff0c;里面存储的是一些json格式的数据&#xff0c;要求将文件中的数据存入数据库表中&#xff0c;以下是一些模拟的数据和对应的数据库…

centos7使用docker-compose一键搭建mysql高可用主从集群

docker部署 环境准备 卸载旧版本 yum remove -y docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine 安装依赖 yum install -y yum-utils \…

伪微分反馈控制(Pesudo-Drivative Feedback Control——PDF)

运动控制-单轴伺服控制带宽分析&#xff08;二&#xff09; - 知乎 (zhihu.com) 伪微分反馈控制_百度百科 (baidu.com) 伺服电机控制器的参数整定_老马过河hhh的博客-CSDN博客 伪微分PIIP控制_yukee10的博客-CSDN博客

docker搭建个人网盘和私有仓库Harbor

目录 1、使用mysql:5.7和 owncloud 镜像&#xff0c;构建一个个人网盘 2、安装搭建私有仓库 Harbor 1、使用mysql:5.7和owncloud&#xff0c;构建一个个人网盘 1.拉取mysql:5.6镜像&#xff0c;并且运行mysql容器 [rootnode8 ~]# docker pull mysql:5.7 [rootnode8 ~]# doc…

Excel VSTO开发10 -自定义任务面板

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 10 自定义任务面板 自定义任务面板&#xff08;有些地方称为侧边面板&#xff09;即CustomTaskPane&#xff0c;这个类在Microsoft…

leetcode 第 361 场周赛

2843. 统计对称整数的数目 核心思想&#xff1a;枚举每一个数是否是对称整数,第一种写法为python写法&#xff0c;第二种为一般写法我觉得更好&#xff0c;非常有思想性。 2844. 生成特殊数字的最少操作 核心思想&#xff1a;枚举特殊数字结尾的几种可能。其实自己做的时候一…