第三章 贪心算法

合集下载

贪心算法实验报告算法实验贪心法实验报告

贪心算法实验报告算法实验贪心法实验报告

贪心算法实验报告算法实验贪心法实验报告西安邮电大学(计算机学院)课内实验报告实验名称:贪心算法专业名称:班级:学生姓名:学号(8指导教师:实验日期:一. 实验目的及实验环境1.练习掌握最有分解问题的规划设计与实现;2.熟练掌握递归算法的设计及应用,怎样才能使算法的空间复杂度和时间复杂度最低;基于Linux系统下的ubuntu或其他的编辑器二. 实验内容1. 设n是一个正整数,现在要求将n分解为若干互不相同的自然数的和,且使这些自然数的乘积最大三.方案设计1.先将这个数分解成以2开始的连续的若干因子,它们的和加起来是n,将此数在后项优先的方式下均匀地分给前面各项。

保证正整数所分解出的因子之差的绝对值最小,即| a – b |最小,可以保证分解乘积越大。

四.测试数据及运行结果1.正常测试数据(3组)及运行结果;A.2.非正常测试数据(2组)及运行结果A.B.五.总结1.实验过程中遇到的问题及解决办法;在实验过程中错误不断地出现,我认真地查阅书籍,研究课本上例题,并且在同学的帮助下纠正了自己的错误,得出了正确的结果。

2.对设计及调试过程的心得体会。

在程序的运行与调试过程中出现了很多错误,但是通过自己复习课本知识、查询资料等,修改后得出了正确的结果。

而且我觉得自己一定要敢于尝试,即使没有结果但是勇于实践就会有意想不到的收获。

所以在以后的学习中我觉得我们一定要集中精力、端正自己态度,提高自己的成绩。

当然我也认识到了自己的薄弱之处,因此我一定争取做的能让自己满意,做的更好。

六.附录:源代码(电子版)#include#includevoid open_file(int n){FILE *fp;if((fp=fopen(“input.txt”,”wt”))==NULL) {printf(“the file write failed.\n”);exit(1);}fprintf(fp,”%2d\n”,n);fclose(fp);}void save_file(int sum){FILE *fp;if((f p=fopen(“output.txt”,”wt”))==NULL) {printf(“ the file save failed!.\n”);exit(1);}fprintf(fp,”%2d\n”,sum);fclose(fp);if((fp=fopen(“output.txt”,”r”))==NULL) {printf(“save file failed!\n”);exit(1);}fscanf(fp,”%2d”,&sum);printf(“\n鏈€澶х?d\n”,sum);fclose(fp);}int MAX(int n){int i=2,j=0,data[n],sum=0,max=1; int lenth; while(sum+i{sum+=i;data[j]=i;i++;j++;}lenth=j;i=n-sum;while(i>0){if(j{data[j+i]+=1;i--;j--;}else{data[j-1]+=1;i--;j--;}}for(i=0;imax*=data[i];return max;}int main(){int n,max;srand((unsigned)time(NULL)); n=rand()%100; open_file(n);printf(“ 杩欎釜鏁版槸%d:\n”,n); max=MAX(n); save_file(max);return 0; }百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网,您的在线图书馆。

贪心算法的基本原理

贪心算法的基本原理

贪心算法的基本原理贪心算法(Greedy Algorithm)是一种常用的算法思想,它在求解最优化问题时通常能够得到较好的近似解。

贪心算法的基本原理是:每一步都选择当前状态下的最优解,从而希望最终能够得到全局最优解。

在实际应用中,贪心算法常常用于解决一些最优化问题,如最小生成树、最短路径、任务调度等。

一、贪心算法的特点贪心算法具有以下特点:1. 简单:贪心算法通常比较简单,易于实现和理解。

2. 高效:贪心算法的时间复杂度通常较低,能够在较短的时间内得到结果。

3. 局部最优:每一步都选择当前状态下的最优解,但不能保证最终能够得到全局最优解。

4. 适用范围:贪心算法适用于一些特定类型的问题,如无后效性、最优子结构等。

二、贪心算法的基本原理贪心算法的基本原理可以概括为以下几个步骤:1. 初始状态:确定问题的初始状态,定义问题的输入和输出。

2. 状态转移:根据当前状态,选择局部最优解,并更新状态。

3. 筛选解:判断当前状态下是否满足问题的约束条件,若满足则保留该解,否则舍弃。

4. 终止条件:重复以上步骤,直至满足终止条件,得到最终解。

三、贪心算法的应用举例1. 找零钱:假设有 25、10、5、1 四种面额的硬币,需要找零 41 元,如何使得找零的硬币数量最少?贪心算法可以先选择面额最大的硬币,然后逐步选择面额较小的硬币,直至找零完毕。

2. 区间调度:给定一组区间,如何选择最多的互不重叠的区间?贪心算法可以先按照区间的结束时间排序,然后依次选择结束时间最早的区间,直至所有区间都被覆盖。

3. 最小生成树:在一个连通的带权无向图中,如何选择边使得生成树的权值最小?贪心算法可以按照边的权值从小到大排序,然后依次选择权值最小且不构成环的边,直至所有顶点都被连接。

四、贪心算法的优缺点1. 优点:贪心算法简单高效,适用于一些特定类型的问题,能够在较短的时间内得到近似最优解。

2. 缺点:贪心算法不能保证一定能够得到全局最优解,可能会出现局部最优解不是全局最优解的情况。

贪心算法(陈鹏)

贪心算法(陈鹏)

— 20 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
2、贪心算法的特点
[贪心算法解题的一般步骤] 1、设计数据找规律 2、进行贪心猜想 3、正确性证明(严格证明和一般证明) ·严格证明:数学归纳和反证法 ·一般证明:列举反例 4、程序实现
— 12 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI201——纪念品分组(NOIP2007普及组)
[输入输出样例] 输入: 输出: 100 6 9 90 20 20 30 50 60 70 80 90
若无法证明, 此步骤可缺省
— 21 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
2、贪心算法的特点
[典型的贪心算法简介] 贪心策略在树和图论中有着极其重要的应用,Prim、 Kruskal、Huffman等体现“贪心”思想的算法更是广泛地 应用于树与图的处理。 下面介绍一种利用“贪心”思想的算法——哈夫曼 (Huffman)树。
—7—
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
1、贪心概念
[求解这类问题的方法] 1、搜索 最原始的方法是搜索(穷举)法。当然,为了尽快搜 索出解,我们往往会利用限制条件进行可行性判断剪枝, 或利用目标函数的上界(或下界)进行分枝定界。 2、动态规划 第二种解决此类问题的方法是动态规划。当然,使用 动态规划必须要满足一些条件,如无后效性和最优子结构 等等。

贪心算法模板

贪心算法模板

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。

贪心算法并不总是得到问题的最优解,但对许多问题它能产生整体最优解或整体最优解的近似解。

下面是一个简单的贪心算法模板,用于解决一些优化问题:pythondef greedy_algorithm(input_data):# 初始化结果变量result = []# 根据输入数据的特性进行排序或预处理sorted_data = sort_or_preprocess(input_data)# 遍历排序后的数据for item in sorted_data:# 检查是否满足某个条件,例如是否可以选择该元素if can_choose(item, result):# 如果满足条件,则选择该元素并更新结果result.append(item)# 可能还需要执行一些额外的操作,例如更新状态或计数器update_state(result, item)return result# 根据具体问题的需要,实现排序或预处理函数def sort_or_preprocess(input_data):# 对输入数据进行排序或预处理pass# 根据具体问题的需要,实现选择条件函数def can_choose(item, result):# 检查是否可以选择该元素pass# 根据具体问题的需要,实现状态更新函数def update_state(result, item):# 更新状态或计数器pass请注意,这只是一个通用的贪心算法模板,具体实现会根据问题的不同而有所变化。

在实际应用中,你需要根据问题的特点来设计合适的排序、选择和状态更新策略。

同时,也需要验证贪心策略是否能够得到全局最优解,或者是否能够得到满意的近似解。

1。

第三章名词解释

第三章名词解释

第三章名词解释1.最小化(minimize)指DFA M状态数的最小化,是指构造一个等价的DFA M',而后者有最小的状态。

2.标示符(IDentifier)是指用来标识某个实体的一个符号。

在不同的应用环境下有不同的含义。

3.正规表达式(regular expression)是说明单词的模式(pattern)的一种重要的表示法(记号),是定义正规集的工具。

4.正规式(Normal form)正规式也称正则表达式,也是表示正规集的数学工具。

5.正规集(Normal set)如果把每类单词视作一种语言,那么每一类单词的全体单词组成了相应的正规集。

6. 有限状态自动机(finite state automaton)有限状态自动机拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。

有限状态自动机可以表示为一个有向图。

有限状态自动机是自动机理论的研究对象。

7.词法分析器(Lexical analyzer)词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用。

8.确定的有限自动机(DFA: Deterministic Finite Automata)自动机的每个状态都有对字母表中所有符号的转移。

9.五元式(Five element type)由五个要素组成的式子K:由有限个状态组成的集合∑:由有限个输入字符组成的字母表f:从K到∑的单值映射,q),(,指明当前态为p,输入字符a,下一个状态为qf=pas:一个属于K的特定状态,称之为初始状态Z:若干个属于K的特定状态,它们组成的集合称之为终态集,记为Z。

10.非确定的有限自动机(NFA:Non deterministic finite automaton)自动机的状态对字母表中的每个符号可以有也可以没有转移,对一个符号甚至可以有多个转移。

自动机接受一个字,如果存在至少一个从q0 到 F 中标记(label)著这个输入字的一个状态的路径。

贪 心 算 法

贪 心 算 法

贪心算法及几个常用的例题贪心算法:一、基本概念:所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。

也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。

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

所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。

二、贪心算法的基本思路:1.建立数学模型来描述问题。

2.把求解的问题分成若干个子问题。

3.对每一子问题求解,得到子问题的局部最优解。

4.把子问题的解局部最优解合成原来解问题的一个解。

三、贪心算法适用的问题贪心策略适用的前提是:局部最优策略能导致产生全局最优解。

实际上,贪心算法适用的情况很少。

一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

四、贪心算法的实现框架从问题的某一初始解出发;while (能朝给定总目标前进一步)利用可行的决策,求出可行解的一个解元素;由所有解元素组合成问题的一个可行解;五、贪心策略的选择因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。

几个经典的例子:一、定义什么是贪心算法呢?所谓贪心算法是指,在对问题求解时,总是做出在当前看来最好的选择。

也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。

贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题都能产生整体最优解或整体最优解的近似解。

贪心算法的基本思路如下:1. .建立数学模型来描述问题。

2. 把求解的问题分成若干个子问题。

3. 对每个子问题求解,得到每个子问题的局部最优解。

4. 把每个子问题的局部最优解合成为原来问题的一个解。

算法设计课程设计零钱问题

算法设计课程设计零钱问题

算法设计课程设计零钱问题一、课程目标知识目标:1. 学生能理解零钱问题的实际背景,掌握其转化为算法问题的方法。

2. 学生能够掌握贪心算法的基本概念及其在零钱问题中的应用。

3. 学生能够运用所学算法,解决至少三种不同组合的零钱问题,并能够解释算法的执行过程。

技能目标:1. 学生通过分析零钱问题,培养将实际问题抽象为算法问题的能力。

2. 学生能够编写简单的程序代码,实现零钱问题的算法解决方案。

3. 学生通过小组合作,提高沟通协作能力,共同完成算法的设计与优化。

情感态度价值观目标:1. 学生在解决零钱问题的过程中,培养对算法设计的兴趣,增强学习算法的自信心。

2. 学生通过探讨算法的优劣,形成批判性思维,学会从多角度分析问题。

3. 学生能够认识到算法在生活中的广泛应用,认识到学习算法的重要性,树立正确的价值观。

课程性质:本课程为零钱问题的算法设计,以实践操作和小组合作为主要教学方式,注重培养学生的实际操作能力和团队协作精神。

学生特点:学生处于能够理解基本算法概念,具备一定编程基础,对实际应用问题充满好奇的阶段。

教学要求:教师需引导学生通过实际案例导入课程,激发学生的学习兴趣,以任务驱动法组织教学,注重学生个体差异,提供个性化指导。

在教学过程中,关注学生的学习成果,及时给予反馈,确保课程目标的达成。

二、教学内容本课程以零钱问题为载体,结合以下教学内容,确保学生掌握算法设计的基本原理和方法。

1. 算法概述:- 算法的基本概念及分类- 算法的效率分析:时间复杂度和空间复杂度2. 贪心算法:- 贪心算法的定义及特点- 贪心算法在零钱问题中的应用3. 零钱问题算法设计:- 零钱问题的实际背景和数学模型- 贪心算法解决零钱问题的步骤和方法- 举例分析:至少三种不同组合的零钱问题4. 编程实践:- 编程环境与工具介绍- 编写代码实现贪心算法解决零钱问题- 小组合作:讨论、优化算法,提高解决问题的效率5. 教学进度安排:- 第一课时:算法概述、贪心算法基本概念- 第二课时:零钱问题背景、数学模型及贪心算法应用- 第三课时:编程实践、小组合作探讨优化算法- 第四课时:成果展示、评价与反馈教学内容关联教材章节:第三章 算法设计与分析,第三节 贪心算法及其应用。

贪心算法PPT课件

贪心算法PPT课件
且有||B’-{k}||>||B-{1}||,这与假设2°矛盾。 ▌
安排方案
f1
B
安排方案
fk
B’
…… 共j个活动
可能 相同 不存在
……
可能
如果 B’包 含这 个活, 则B 一定 包含
9
(2) 时间复杂度分析: 因为排序过程可以在O(nlogn)时间内完成,而求最优活动子 集的过程只需O(n)次比较,因此这个算法的时间复杂度为 O(nlogn)。 (3) 贪心策略设计算法的一般特点
·选Si最小的,这样可以增大场地的利用率; ·选fi最小的,使得下一个活动可以更早开始。
由于活动的占用时间长度没有限制,因此后一选择更合理。
6
为了在每一次选择时取当前可以安排的活动中最早结束的活动,应首先把 n项活动按结束时间的先后进行升序排序。即,使f1≤f2≤…≤fn,然后在Si值 不小于当前时刻的活动中取fi值最小者。 算法:
·算法的设计比较简单; ·算法一般比较快速; ·算法的正确性一般不明显,需要论证;如果正确性不能保 证,那么它往往可以得到近似最优解。
10
5.2 背包(Knapsack)问题
1. 问题描述
已知:n个(应为n种)物体{1,2,…,n}与一个背包。物体i的重量 (或体积)为Wi>0,价值为Pi>0(i=1,2,…,n),背包容量为 M>0。
计算机算法 ——设计与分析导论
刘璟
1
Chapter 5. 贪心(Greedy)技术
❖ 5.1 贪心策略的思想 ❖ 5.2 背包(Knapsack)问题 ❖ 5.3 Huffman编码 ❖ 5.4 多机调度问题的近似解法 ❖ 5.5 单源最短路径的Dijkstra算法

算法设计与分析知识点

算法设计与分析知识点

第一章算法概述1、算法的五个性质:有穷性、确定性、能行性、输入、输出。

2、算法的复杂性取决于:(1)求解问题的规模(N) , (2)具体的输入数据(I),( 3)算法本身的设计(A),C=F(N,I,A。

3、算法的时间复杂度的上界,下界,同阶,低阶的表示。

4、常用算法的设计技术:分治法、动态规划法、贪心法、回溯法和分支界限法。

5、常用的几种数据结构:线性表、树、图。

第二章递归与分治1、递归算法的思想:将对较大规模的对象的操作归结为对较小规模的对象实施同样的操作。

递归的时间复杂性可归结为递归方程:1 11= 1T(n) <aT(n—b) + D(n) n> 1其中,a是子问题的个数,b是递减的步长,~表示递减方式,D(n)是合成子问题的开销。

递归元的递减方式~有两种:1、减法,即n -b,的形式。

2、除法,即n / b,的形式。

2、D(n)为常数c:这时,T(n) = 0(n P)。

D(n)为线形函数cn:r O(n) 当a. < b(NT(n) = < Ofnlog^n) "n = blljI O(I1P)二"A bl吋其中.p = log b a oD(n)为幕函数n x:r O(n x) 当a< D(b)II JT{ii) = O(ni1og b n) 'ia = D(b)ll].O(nr)D(b)lHJI:中,p= log b ao考虑下列递归方程:T(1) = 1⑴ T( n) = 4T(n/2) +n⑵ T(n) = 4T(n/2)+n2⑶ T(n) = 4T(n/2)+n3解:方程中均为a = 4,b = 2,其齐次解为n2。

对⑴,T a > b (D(n) = n) /• T(n) = 0(n);对⑵,•/ a = b2 (D(n) = n2) T(n) = O(n2iog n);对⑶,•/ a < b3(D(n) = n3) - T(n) = 0(n3);证明一个算法的正确性需要证明两点:1、算法的部分正确性。

贪心算法在最优化问题中的应用研究

贪心算法在最优化问题中的应用研究

贪心算法在最优化问题中的应用研究第一章:引言贪心算法是在最优化问题中被广泛应用的一种算法。

在计算机科学领域中,贪心算法是一种启发式算法,通过在每个步骤中选择最优解决方案来达到整体最优解决方案。

贪心算法的特点是该算法快速简单且易于理解。

在不同的最优化问题中,贪心算法具有不同的应用方法和实现方式。

本文将介绍贪心算法的基本原理和应用方法,并从实际问题出发,分析贪心算法在最优化问题中的应用实例。

第二章:贪心算法基本原理贪心算法是一种求解最优解的启发式算法。

贪心算法在每个步骤中选择当前状态下的最优解,使得整体解决方案达到最优化。

贪心算法与动态规划、分支界限等算法相比较,贪心算法具有简单快速的特点。

贪心算法的过程如下:1、定义最优解。

2、根据问题定义选择一个最优解策略。

3、根据最优策略,在当前状态下选择最优的解。

4、对于已选择的最优解,在下一个状态下重复步骤3,直到达到最优解。

贪心算法的正确性需要证明,即要证明每一步选择的最优解可以达到整体最优解。

第三章:贪心算法应用方法针对不同的最优化问题,贪心算法具有不同的应用方法。

本节将从两个方面来介绍贪心算法应用的两种方法。

1、构造法贪心算法通过构造法实现。

通常情况下,构造法通过从剩余选项中选择当前状态下的最优解。

举例说明,对于背包问题,贪心算法以价值单位最高为准则优先选取物品装入背包中。

在霍夫曼编码问题中,贪心算法选择以最小的频率为基准选择编码,这样可以使总编码长度最小。

2、优化法贪心算法通过优化法实现。

通常情况下,优化法通过贪心算法的思路对问题进行重构。

这样,在选择最优状态时,将避免一些不必要的无效状态。

举例说明,对于旅行推销员问题,贪心算法可以通过选择离当前节点距离最近的邻居节点,避免重复和无效的状态。

第四章:应用实例贪心算法在不同的实际问题中得到了充分的应用。

在本章中,将通过两个实际问题来展示贪心算法的具体应用。

1、硬币找零贪心算法在硬币找零问题中得到了应用。

03贪心算法

03贪心算法

第3章贪心算法贪心算法一般来说是解决“最优问题”,具有编程简单、运行效率高、空间复杂度低等特点。

是程序竞赛中的一个有力武器,受到广大同学们的青睐。

贪心算法一般是求“最优解”这类问题的。

最优解问题可描述为:有n个输入,它的解是由这n个输入的某个子集组成,并且这个子集必须满足事先给定的条件。

这个条件称为约束条件。

而把满足约束条件的子集称为该问题的可行解。

这些可行解可能有多个。

为了衡量可行解的优劣,事先给了一个关于可行解的函数,称为目标函数。

目标函数最大(或最小)的可行解,称为最优解。

贪心算法的正确性证明虽然不容易,但一些常见的方法还是值得总结的。

1.构造法根据描述的算法,用贪心的策略,依次构造出一个解,可证明一定是合法的解。

即用贪心法找可行解。

2.反证法用贪心的策略,依次构造出一个解S1。

假设最优解S2不同与S1,可以证明是矛盾的。

从而S1就是最优解。

3.调整法用贪心的策略,依次构造出一个解S1。

假设最优解S2不同与S1,找出不同之处,在不破坏最优性的前提下,逐步调整S2,最终使其变为S1。

从而S1也是最优解。

3.1 构造法构造法就是从一个空的解开始,根据贪心策略,逐步将新的内容加入原有的解中,直到满足要求或无法将新的元素加入为止。

也可以将使用相反的手段,即先将整个解设定为一个最大的集合,然后,用贪心策略逐步从原有解中取出元素,直至满足要求或无法取出元素为止。

本节例题将介绍第一种贪心的例子。

3.1.1 〖案例1〗订票一家票务办公室为音乐会售票。

它们以出售某一固定数量的连号票(简称套票)来替代常见的单张票销售。

票务办收到了大量的购票订单。

套票的订单以该套票中最小的座位号作为标识。

然而票务办并不能满足所有的订单,而且如果他们完全按照观众的要求来分·60· ACM 程序设计培训教程配座位,就会出现很多空位。

为此票务办采取了如下的座位分配和价格策略:如果一个订单被接受且完全按照观众的要求安排座位,那么观众就要付全价(每套票2 petaks);如果一个订单虽被接受但是至少有一个座位与观众的要求不同,那么顾客只需付半价(每套票1 petaks)。

贪心算法概述及研讨

贪心算法概述及研讨

对贪心算法的概述和研讨福州第一中学高一(8)班汪涛指导老师:陈颖算法总览当一个问题具有“最优子结构”时,我们可以采用动态规划法解决该问题。

但是有的时候,贪心算法可以更好的处理该类问题。

总体上看,贪心算法是一种高效的、不稳定的算法;但是它在解决问题时有很多独特的优良性质,掌握贪心算法有时可以非常迅速的获得最优解或近似最优解。

关键字:贪心算法(贪婪算法),贪心算法的应用举例,Object Pascal,快速算法,不稳定算法,信息学奥赛。

何时采用何时能,又何时应该采用贪心算法呢?一般认为,凡是经过数学归纳法证明可以采用贪心算法的情况,都应该采用它。

因为它的效率是很高的。

贪心算法的弱点在于它的不稳定性,即有时它不总能返回最优解。

那么能采用贪心算法的问题具有怎样的性质呢?(何时采用贪心算法)1、它具有和动态规划问题相似的性质,即分治法中的“最优子结构”性质,即每个子问题的最优解的集合就是整体最优解。

这是必须的性质,因为贪心算法解决的问题流程就需要依序研究每个子问题,然后综合之得出最后结果。

不能采用分治法解决的问题,是理论上是不能使用贪心算法的。

而且,必须拥有最优子结构性质,才能保证贪心算法返回最优解。

2、它必须具有一种特殊的“贪心选择性”。

这种性质类同于“最优子结构”性质,但又有一些小的差别。

我们知道,在动态规划中,每一个父问题结果的得出需要它的子问题作为条件;但是“贪心选择性”则不需要;贪心选择性所做的是一个非线性的子问题处理过程,即一个子问题并不依赖于另一个子问题,但是子问题间有严格的顺序性。

要证明一个问题具有“贪心选择性”,就必须证明每一步所做的贪心选择最终导致一个问题的整体最优解。

这也是必须的性质。

如果一个问题具有上述两个性质,理论上就应该采用贪心算法。

处理流程经由贪心算法处理的问题需要经过排序。

即把“最贪心”的子结果排在序列的最前面,一直到“最不贪心的”。

这是处理问题的第一步。

然后依序解决问题而得出最终结果。

贪心算法基本思想和典型例题(转)

贪心算法基本思想和典型例题(转)

贪⼼算法基本思想和典型例题(转)贪⼼算法⼀、算法思想贪⼼法的基本思路:——从问题的某⼀个初始解出发逐步逼近给定的⽬标,以尽可能快的地求得更好的解。

当达到某算法中的某⼀步不能再继续前进时,算法停⽌。

该算法存在问题:1. 不能保证求得的最后解是最佳的;2. 不能⽤来求最⼤或最⼩解问题;3. 只能求满⾜某些约束条件的可⾏解的范围。

实现该算法的过程:从问题的某⼀初始解出发;while 能朝给定总⽬标前进⼀步 do 求出可⾏解的⼀个解元素;由所有解元素组合成问题的⼀个可⾏解;⼆、例题分析1、[背包问题]有⼀个背包,背包容量是M=150。

有7个物品,物品可以分割成任意⼤⼩。

要求尽可能让装⼊背包中的物品总价值最⼤,但不能超过总容量。

物品 A B C D E F G重量 35 30 60 50 40 10 25价值 10 40 30 50 35 40 30分析:⽬标函数: ∑pi最⼤约束条件是装⼊的物品总重量不超过背包容量:∑wi<=M( M=150)(1)根据贪⼼的策略,每次挑选价值最⼤的物品装⼊背包,得到的结果是否最优?(2)每次挑选所占空间最⼩的物品装⼊是否能得到最优解?(3)每次选取单位容量价值最⼤的物品,成为解本题的策略。

实现这个算法是学习算法分析与设计这门课程的需要。

贪⼼算法是所接触到的第⼀类算法。

算法从局部的最优出发,简单⽽快捷。

对于⼀个问题的最优解只能⽤穷举法得到时,⽤贪⼼法是寻找问题次优解的较好算法。

贪⼼法是⼀种改进了的分级处理⽅法。

⽤贪⼼法设计算法的特点是⼀步⼀步地进⾏,根据某个优化测度(可能是⽬标函数,也可能不是⽬标函数),每⼀步上都要保证能获得局部最优解。

每⼀步只考虑⼀个数据,它的选取应满⾜局部优化条件。

若下⼀个数据与部分最优解连在⼀起不再是可⾏解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为⽌。

这种能够得到某种度量意义下的最优解的分级处理⽅法称为贪⼼法。

选择能产⽣问题最优解的最优度量标准是使⽤贪⼼法的核⼼问题。

【精选】贪心算法

【精选】贪心算法

【精选】贪心算法贪心算法近年来的信息学竞赛中,经常需要求一个问题的可行解和最优解,这就是所谓的最优化问题。

贪心法是求解这类问题的一种常用算法。

在众多的算法中,贪心法可以算的上是最接近人们日常思维的一种算法,他在各级各类信息学竞赛、尤其在一些数据规模很大的问题求解中发挥着越来越重要的作用。

一、什么是贪心法贪心法是从问题的某一个初始状态出发,通过逐步构造最优解的方法向给定的目标前进,并期望通过这种方法产生出一个全局最优解的方法。

做出贪心决策的依据称为贪心准则(策略),但要注意决策一旦做出,就不可再更改。

贪心与递推不同的是,推进的每一步不是依据某一固定的递推式,而是做一个当时看似最佳的贪心选择,不断的将问题实例归纳为更小的相似子问题。

所以,在有些最优化问题中,采用贪心法求解不能保证一定得到最优解,这时我们可以选择其他解决最优化问题的算法,如动态规划等。

归纳、分析、选择贪心准则是正确解决贪心问题的关键。

二、贪心法的特点及其优缺点贪心法主要有以下两个特点:贪心选择性质:算法中每一步选择都是当前看似最佳的选择,这种选择依赖于已做出的选择,但不依赖于未作出的选择。

最优子结构性质:算法中每一次都取得了最优解(即局部最优解),要保证最后的结果最优,则必须满足全局最优解包含局部最优解。

利用贪心法解题的一般步骤是:1、产生问题的一个初始解;2、循环操作,当可以向给定的目标前进时,就根据局部最优策略,向目标前进一步;3、得到问题的最优解(或较优解)。

贪心法的优缺点主要表现在:优点:一个正确的贪心算法拥有很多优点,比如思维复杂度低、代码量小、运行效率高、空间复杂度低等,是信息学竞赛中的一个有力武器,受到广大同学们的青睐。

缺点:贪心法的缺点集中表现在他的“非完美性”。

通常我们很难找到一个简单可行并且保证正确的贪心思路,即使我们找到一个看上去很正确的贪心思路,也需要严格的正确性证明。

这往往给我们直接使用贪心算法带来了巨大的困难。

贪心算法

贪心算法

6.贪心方法模型
a.工程计划模型 b.部分背包与每步最优 c.构造贪心算法
a.工程计划模型
我们常常碰到这样的问题:完成一个工程需
要若干个步骤,每个步骤都有若干种方法, 图示—— 步骤a 步骤b 步骤c ... 步骤n 方法b1 方法c1 方法a1 方法b2 方法c2 方法n1 方法a2 方法b3 方法c3 方法c4

种树问题:一条街道分为n个区域(按1-n编号), 每个都可种一棵树。有m户居民,每户会要求在区 域i-j区间内种至少一棵树。现求一个能满足所有要 求且种树最少的方案。 算法构造: 1.对于要求,以区间右端(升序)为首要关键字, 左端(升序)为次要关键字排序。 2.按排好的序依次考察这些要求,若未满足,则在 其最右端的区域种树,这时可能会满足多个要求。 证明思路:解法并不唯一,关键是证明没有比该解 法更好的解法。按步骤1排序之后,会发现对于每 个要求,在最右边的区域内种树所得的结果总不会 差于在其他区域种树。至于为什么这样排序,留给 你——读者们思考吧。

每个方法有一个权值(如效率、质量),其大小往 往和其他步骤中选取的方法有关。有些时候权值无 意义,表示方法不可选择。要求给出一个方法组合, 是权值和最大。 在这里,暂且把它称作“工程计划”。很多实际问 题都可以归纳为这个模型。 对于不同形式的工程计划,我们有不同的解法。 若权值与整个过程或前后步骤的方法选择都有关, 我们使用搜索算法——时间复杂度高得吓人。 若每个权值只与上(或下)一步或少数几步的方法 选择都有关,我们使用动态规划——有比较高的效 率,在下一章会讲到。 若每个权值与其他步骤的方法选择都没有关系,我 们使用贪心方法。

算法分析:设a[i]为第I堆纸牌的张数(0<=I<=n), v为均分后每堆纸牌的张数,s为最小移动次数。 我们用贪心算法,按照从左到右的顺序移动纸牌。 如第I堆的纸牌数不等于平均值,则移动一次(即s 加1),分两种情况移动: 1.若a[i]>v,则将a[i]-v张从第I堆移动到第I+1堆; 2.若a[i]<v,则将v-a[i]张从第I+1堆移动到第I堆。 为了设计的方便,我们把这两种情况统一看作是将 a[i]-v从第I堆移动到第I+1堆,移动后有a[i]=v; a[I+1]=a[I+1]+a[i]-v. 在从第I+1堆取出纸牌补充第I堆的过程中可能回出 现第I+1堆的纸牌小于零的情况。

贪心算法-例题讲解

贪心算法-例题讲解

贪⼼算法-例题讲解前⾔:此博客在写作过程中参考了⼤量资料和博客,不能⼀⼀列举,还请见谅。

概述贪⼼法:从问题的某⼀个初始状态出发,逐步构造最优解从⽽向⽬标前进,并期望通过这种⽅法产⽣出⼀个全局最优解的⽅法贪⼼是⼀种解题策略,也是⼀种解题思想,⽽不是算法贪⼼策略与其他算法的区别贪⼼与递推:贪⼼法推进每⼀步不依据某⼀固定的递推式,⽽是当前看似最佳的贪⼼决策,不断的将问题归纳为更加⼩的相似的⼦问题贪⼼与动态规划:贪⼼是“⿏⽬⼨光”;动态规划是“统揽全局”贪⼼法的优缺点优点:思维复杂度低、代码量⼩、运⾏效率⾼、空间复杂度低等缺点:很难找到⼀个简单可⾏并且保证正确的贪⼼思路贪⼼算法的应⽤贪⼼算法的常⽤范围有明显的贪⼼可证明贪⼼策略的贪⼼(最常见的)贪⼼数据结构:堆/Kruskal/Prim/Dijkstra博弈/游戏策略,这些策略⼤多是贪⼼求较优解或多次逼近求最优解⼏个简单的贪⼼例⼦最优装载问题:给n个物体,第i个物体重量为wi,选择尽量多的物体,使得总重量不超过C贪⼼策略:先拿轻的部分背包问题:有n个物体,第i个物体的重量为wi,价值为vi,在总重量不超过C的情况下让总价值尽量⾼。

每⼀个物体可以只取⾛⼀部分,价值和重量按⽐例计算贪⼼策略:先拿性价⽐⾼的乘船问题:有n个⼈,第i个⼈重量为wi。

每艘船的载重量均为C,最多乘两个⼈。

⽤最少的船装载所有⼈贪⼼策略:最轻的⼈和最重的⼈配对例题(基础)1.删数问题-【问题描述】键盘输⼊⼀个⾼精度的正整数n(n<=240位),去掉其中任意s个数字后剩下的数字按照原来的次序将组成⼀个新的正整数。

编程对给定的n和s,寻求⼀种⽅案,使得剩下组成的新数最⼩。

贪⼼策略为:每⼀步总是选择⼀个使剩下的数最⼩的数字删去,即按⾼位到低位的顺序搜索,若各位数字递增,则删除最后⼀个数字,否则删除第⼀个递减区间的⾸字符。

然后回到串⾸,按上述规则再删除下⼀个数字。

重复以上过程s次,剩下的数字串便是问题的解了。

贪心算法

贪心算法

max vi xi
i 1
n
于是,背包问题归结为寻找一个满足约束条 件式,并使目标函数式达到最大的解向量X=(x1, x2, …, xn)。
至少有三种看似合理的贪心策略: (1)选择价值最大的物品,因为这可以尽可能快 地增加背包的总价值。但是,虽然每一步选择获得 了背包价值的极大增长,但背包容量却可能消耗得 太快,使得装入背包的物品个数减少,从而不能保 证目标函数达到最大。 (2)选择重量最轻的物品,因为这可以装入尽可 能多的物品,从而增加背包的总价值。但是,虽然 每一步选择使背包的容量消耗得慢了,但背包的价 值却没能保证迅速增长,从而不能保证目标函数达 到最大。 (3)选择单位重量价值最大的物品,在背包价值 增长和背包容量消耗两者之间寻找平衡。
算法
main( ) { int i,j,n,GZ,A; int B[8]={0,100,50,20,10,5,2,1},S[8]; input(n); for(i=1;i<=n;i++) { input(GZ); for(j=1,j<=7;j++) { A=GZ/B[j]; S[j]=S[j]+A; GZ=GZ-A*B[j];} } for(i=1;i<=7;i++) print(B[i], “----”, S[i]); }
∞ b 4 0 a 8 h ∞ 4 b 4 0 a 8 h 8 11 7 11 7
8 ∞ i 6 1 2
∞ c
7
∞ d 14 9 e ∞ 10
4 g ∞
2
f ∞
(a)
8 ∞ i 6 1 g ∞ 2 4 f ∞ ∞ c 7 ∞ d 14 9 e ∞ 10 2
贪心法求解活动安排问题的关键是如何选择贪心策略,使 得按照一定的顺序选择相容活动,并能安排尽量多的活动。至 少有两种看似合理的贪心策略: (1)最早开始时间:这样可以增大资源的利用率。 (2)最早结束时间:这样可以使下一个活动尽早开始。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Dde+Dab+Dbc+Def+[Ddf];(形成小回路,舍弃) Dde+Dab+Dbc+Def+[Dbe];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+[Dbd];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd; Dde+Dab+Dbc+Def+Dcd+[Dbf];(b顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dce];(c、e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dae];(e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dae];(e顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+[Dad];(d顶点度数超过2,舍弃) Dde+Dab+Dbc+Def+Dcd+Daf;得到1条回路
2021/2/22
5
如果问题改成:砝码的种类分别为11克、5克和1克, 待称的物体是15克。用贪婪算法应先选一个11克的,然 后选四个1克的,共用五个砝码。这不是最优结果,只 要用三个5克的砝码就够了。
贪婪算法虽不能保证得到最优结果,但对于一些除
了“穷举”方法外没有有效算法的问题,用贪婪算法往
往能很快地得出较好的结果,如果此较好结果与最优结 果相差不是很多的话,此方法还是很实用的。
2021/2/22
9
当n不太大时,适当的取k值,此改进方法常常可以得到 最优解,但不能因此就说一般背包问题有多项式算法。 当n增大时,k不能随着n不断的加大,如k随n增大而同 时加大,其复杂性就是指数型而不是多项式型的了,而 如k取值较小,又不能保证得出最优解。
2021/2/22
10
例3.巡回推销员问题
(下标中5出现了3次,顶点5有三条边相连,d45(6)放弃) d24(1)+d13(2)+d15(2)+d25(3)+[d35(9)];
(下标中5出现了3次,顶点5有三条边相连,d35(9)放弃) d24(1)+d13(2)+d15(2)+d25(3)+d34(9)。
得到一条回路:
v1→v3→v4→v2→v5→v1
同由分枝限解方法得到的路径相同,因此是最佳 的回路。
2021/2/22
13
例4 设有六个城市,其坐标分别为a(0,0), b:(4,3), c:(1,7), d:(15,7), e(15,4), f:(18,0)。如下图所示:
2021/2/22
14
6座城市间的距离矩阵为:
5 7.07 16.55 15.52 18
(1)使任一城市的度数(连线数)超过2的连线必须 舍弃;
(2)在得到经过所有点的回路前就形成小回路的连 线必须舍弃。
距离按从小到大的次序排列:
Dde(3),
Def(5), Dbe(11.01), Dbf(14.32), Dad(16.55),
Dab(5),
Dbc(5),
Dac(7.07), Ddf(7.62),
当n>m时,我们首先将n个作业依其所需的处理时间 从大到小排序。然后依此顺序将作业分配给空闲的处理 机。
2021/2/22
21
例如,设7个独立作业{1,2,3,4,5,6,7}由3台机器 M1,M2,和M3来加工处理。各作业所需的处理时间分别为 {2,14,4,16,6,5,3}。按贪婪算法产生的作业调度如图4-13 所示,所需的加工时间为17。
5
5 11.7 11.01 14.32
7.07 5 D16.55 11.7 14
14 14.32 18.38
3 7.62
15.52 11.01 14.32 3 5
18 14.32 18.38 7.62 5
2021/2/22
15
用贪婪算法,先将任两城市间的连线距离按从小到 大的次序排列,然后从中逐个选择。但有两种情况的 连线应舍弃:
多机调度问题要求给出一种作业调度方案,使所 给的n个作业在尽可能短的时间内由m台机器加工处 理完成。
2021/2/22
20
这个问题是一个NP完全问题,到目前为止还没有一个 有效的解法。对于这一类问题,用贪婪选择策略有时可 以设计出较好的近似算法。采用最长处理时间作业优先 的贪婪选择策略可以设计出解多机调度问题的较好的近 似算法。按此策略,当n≤m时,我们只要将机器i的[0,ti] 时间区间分配给作业i即可。
2021/2/22
17
最后得到的回路如图(a)的结果,总长度为50。
2021/2/22
18
不过,这不是此问题的最优解,此问题的最优解为下图 所示的路径(可以用分枝限界等方法求得),总长度为 48.39。用贪婪方法得到的结果同最优解相比只多了3.3%。
2021/2/22
19
例5: 多机调度问题
设有n个独立的作业{1,2,…,n},由m台相同的 机器进行加工处理。作业i所需的处理时间为ti。现 约定,任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理。任何作业不能拆分成 更小的子作业。
网络的最小生成树在实际中有广泛应用。例如,在设计 通信网络时,用图的顶点表示城市,用边(v,w)的权c[v][w] 表示建立城市v和城市w之间的通信线路所需的费用,则最 小生成树就给出了建立通信网络的最经济的方案。
2021/2/22
23
Kruskal最小生成树算法
Kruskal 在1956年提出了1个最小生成树算法, 它的思路很容易理解。设G=(V,E)是一个连通带权 图,V={1,2,…,n}。将图中的边按其权值由小到大 排序,然后作如下的贪婪选择,由小到大顺序选取 各条边,若选某边后不形成回路,则将其保留作为 树的一条边;若选某边后形成回路,则将其舍弃, 以后也不再考虑。如此依次进行,到选够(n-1) 条边即得到最小生成树。
2021/2/22
7
C
如果对上述算法作一些改进,可得到更好的结果。先从 n个物体中试着取j个总体积不超过C的装入背包,剩下 的(n-j)个物体则利用贪婪算法尽量往里装。此j值从零 开始逐渐增加,反复进行试探,直至j达到某预先给定 的常数k(0<k<n),最后从这些结果中取其最好的一个。 如果在试探中能得到一个完全装满的方案,则此过程就 可提前结束。因为从n个物体中取出j个共有 C n种j 方案, 此值随着j的增加而增加较快,但可以证明此改进算法 的复杂性为O(knk+1),因k是常数,故仍为多项式界的 算法。
第三章 贪心算法
2021/2/22
1
算法设计与分析
——贪婪算法
2021/2/22
2
贪婪算法(greedy algorithms,也叫登山法)
我们来看一个找硬币的例子。假设有四种硬币, 它们的面值分别为二角五分、一角、五分和一分。现 在要找给某顾客六角三分钱。这时,我们会不假思索 地拿出2个二角五分的硬币,1个一角的硬币和3个一 分的硬币交给顾客。这种找硬币方法与其他的找法相 比,所拿出的硬币个数是最少的。这里,我们下意识 地使用了这样的找硬币算法:首先选出一个面值不超 过六角三分的最大硬币,即二角五分;然后从六角三 分中减去二角五分,剩下三角八分;再选出一个面值 不超过三角八分的最大硬币,即又一个二角五分,如 此一直做下去。这个找硬币的方法实际上就是贪婪算 法。
d34=5 d23=5 d12=6 d35=6 d56=6
2021/2/22
26
Prim最小生成树算法
Prim在1957年提出另一种算法,这种算法特别适 用于边数相对较多,即比较接近于完全图的图。此算 法是按逐个将顶点连通的步骤进行的,它只需采用一 个顶点集合。这个集合开始时是空集,以后将已连通 的顶点陆续加入到集合中去,到全部顶点都加入到集 合中了,就得到所需的生成树。
设G=(V,E)是一个连通带权图,V={1,2,…,n}。构造 G的一棵最小生成树的Prim算法的过程是:首先从图 的任一顶点起进行,将它加入集合S中置,S={1},然 后作如下的贪婪选择,从与之相关联的边中选出权值 c[i][j]最小的一条作为生成树的一条边,此时满足条件 iS,jV-S,并将该j加入集合中,表示连两个顶点已 被所选出的边连通了。
Dbd(11.7), Dcd(14),
Dce(14.32), Dae(15.52),
Daf(18), Def(18.38)
2021/2/22
16
按贪婪算法原则,其选择过程如下:
Dde; Dde+Dab; Dde+Dab+Dbc; Dde+Dab+Dbc+Def;
Dde+Dab+Dbc+Def+[Dac];(形成小回路,舍弃)
当n>m时,因此算法所需的计算时间复杂度为O(nlogn)。
2021/2/22
22
例6: 最小生成树
一般情况下,用贪婪算法得到的是近似解,而不能保
证得到最优解。但用贪婪方法计算最小生成树,却可以设 计出保证得到最优解的算法。
设G=(V,E)是一个无向连通带权图,即一个网络。E中 每条边(v,w)的权为c[v][w]。如果G的一个子图G’是一棵包 含G的所有顶点的树,则称G’为G的生成树。生成树上各边 权的总和称为该生成树的费用。在G的所有生成树中,费用 最小的生成树称为G的最小生成树。
由于是5个城市,环绕一圈为5条边,贪婪方法 求解此问题的过程是从最小边开始,依此从小到大 取边加入到回路边集中,但在将1条边加入时不能使 1顶点的度数超过3,也不能形成小回路。
相关文档
最新文档