贪心法例题

合集下载

贪心PPT课件

贪心PPT课件
方法如下:先将单位块收益按从大到小进行排列,然后 用循环从单位块收益最大的取起,直到不能取为止便得到了 最优解。
【问题2】0/1背包问题
给定一个最大载重量为M的卡车和N种动物。已知第i种动 物的重量为Wi,其最大价值为Vi,设定M,Wi,Vi均为整 数,编程确定一个装货方案,使得装入卡车中的所有动物 总价值最大。
给定一个最大载重量为M的卡车和N种食品,有食盐,白 糖,大米等。已知第i种食品的最多拥有Wi公斤,其商品 价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车 中的所有物品总价值最大。
【分析】因为每一个物品都可以分割成单位块,单位块的利 益越大,显然总收益越大,所以它局部最优满足全局最优, 可以用贪心法解答。
6 5 3 7 1 9 10 【样例输出】 90
【思路点拨】假设取水的人按照1...n的顺序排列的,那么问题就转 化为求以下公式的最小值:
Total=T1+(T1+T2)+(T1+T2+T3)+...+(T1+T2+...+Tn),对公式换个 写法:
Total=nT1+(n-1)T2+(n-2)T3...+2Tn-1+Tn 现在你是否发现一点什么呢?
【分析】按贪心法:每次选价格最大的装载。很明显有反例: 设N=3,卡车最大载重量是100,三种动物A、B、C的重量分别 是40,50,70,其对应的总价值分别是80、100、150。
三、贪心策略与其他算法的区别
1.贪心与递推:与递推不同的是,贪心法中推进的每一步 不是依据某一固定的递推式,而是当前看似最佳的贪心决 策,不断的将问题归纳为更加小的相似的子问题。所以归 纳、分析、选择正确合适的贪心策略,是正确解决贪心问 题的关键。

贪心算法实例分析

贪心算法实例分析

贪心算法实例分析贪心算法,是一种常见的解决问题的方法,尤其在最优化问题中得到了广泛的应用。

简单来说,贪心算法是建立在选取局部最优解的基础上,通过不断的贪心选择,达到全局最优解的目的。

本文将通过两个实例,介绍使用贪心算法的思路和实现方法。

实例一:零钱兑换问题假设有 n 种不同面值的硬币,每种面值的硬币数量无限,现在需要兑换一个目标值amount 元,求兑换所需的最少硬币数。

例如:有2元、5元、10元、20元、50元、100元六种面值的硬币,需要兑换52元,则兑换最少需要三枚硬币:两枚20元硬币和一枚10元硬币。

思路分析:对于这个问题,我们可以把它看成选择一定数量的硬币使其面值之和等于 amount,且硬币数量最少。

为了使硬币数量最少,我们每次都选取当前面值最大并且小于剩余兑换金额的硬币。

这相当于在每个阶段选择局部最优解,最终得到的就是全局最优解。

实现方法:1. 排序:将硬币面额按从大到小的顺序排列。

2. 贪心选择:从面额最大的硬币开始选取,直到兑换金额为 0 或全部面额都被选择过。

代码示例:```pythondef coinChange(coins, amount):coins.sort(reverse=True) # 排序res = 0for coin in coins:while amount >= coin: # 贪心选择amount -= coinres += 1return res if amount == 0 else -1```实例二:区间调度问题假设有 n 个区间 [start, end],现在需要选出最多的区间,使得它们没有重叠。

例如:有四个区间[1,3]、[2,4]、[3,6]、[5,7],选出的最多区间数是 3,即选出[1,3]、[3,6]、[5,7]这三个区间。

思路分析:这个问题可以看成排序和贪心选择问题的复合。

首先,我们将所有区间按照 end 非递减的顺序排序。

然后从第一个区间开始,依次选取与当前区间不重叠且start 大于等于当前区间的所有区间,直到所有区间都被检查完。

贪心算法几个经典例子c语言

贪心算法几个经典例子c语言

贪心算法几个经典例子c语言1. 零钱兑换问题题目描述:给定一些面额不同的硬币和一个总金额,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。

如果没有任何一种硬币组合能够凑出总金额,返回 -1。

贪心策略:每次选择面额最大的硬币,直到凑出总金额或者无法再选择硬币为止。

C语言代码:int coinChange(int* coins, int coinsSize, int amount){int count = 0;for(int i = coinsSize - 1; i >= 0; i--){while(amount >= coins[i]){amount -= coins[i];count++;}}return amount == 0 ? count : -1;}2. 活动选择问题题目描述:有 n 个活动,每个活动都有一个开始时间和结束时间,选择一些活动使得它们不冲突,且能够参加的活动数最多。

贪心策略:每次选择结束时间最早的活动,直到所有活动都被选择或者无法再选择为止。

C语言代码:typedef struct{int start;int end;}Activity;int cmp(const void* a, const void* b){return ((Activity*)a)->end - ((Activity*)b)->end;}int maxActivities(Activity* activities, int n){qsort(activities, n, sizeof(Activity), cmp);int count = 1;int end = activities[0].end;for(int i = 1; i < n; i++){if(activities[i].start >= end){count++;end = activities[i].end;}}return count;}3. 跳跃游戏题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。

贪心算法——精选推荐

贪心算法——精选推荐

贪⼼算法【贪⼼算法】思想 & 基本要素 & 贪⼼算法与局部最优 & 贪⼼算法与动态规划的区别 & 运⽤贪⼼算法求解问题⾸先我们先代⼊问题来认识⼀下贪⼼算法涉及的问题找钱问题给顾客找钱,希望找零的钞票尽可能少,零钱种类和数量限定找钱问题满⾜最优⼦结构最快找零(贪⼼):为得到最⼩的找零次数,每次最⼤程度低减少零额活动安排问题设个活动都需要使⽤某个教室,已知它们的起始时间和结束时间,求合理的安排使得举⾏的活动数量最多贪⼼:使得每次安排后,教室的空闲时间最多解决过程如下:贪⼼算法求得的相容活动集是最⼤的第⼀步:证明最优解中包含结束时间最早的活动设相容集 A 是⼀个最优解,其结束最早的活动为 a,则 ( A - { a }) U { 1 } 也是⼀个最优解第⼆步:证明去掉结束时间最早的活动后,得到的⼦问题仍是最优的:反证法理解贪⼼算法贪⼼算法总是做出当前最好的选择贪⼼选择的依据是当前的状态,⽽不是问题的⽬标贪⼼选择是不计后果的贪⼼算法通常以⾃顶向下的⽅法简化⼦问题贪⼼算法求解的问题具备以下性质贪⼼选择性质:问题的最优解可以通过贪⼼选择实现最优⼦结构性质:问题的最优解包含⼦问题的最优解贪⼼选择性质的证明证明问题的最优解可以由贪⼼选择开始即第⼀步可贪⼼证明贪⼼选择后得到的⼦问题满⾜最优⼦结构即步步可贪⼼背包问题问题描述:给定 n 个物品和⼀个背包。

物品 i 的重量为 Wi ,价值为 Vi ,背包的容量为 c ,问如何选择物品或物品的⼀部分,使得背包中物品的价值最⼤?当 n = 3 ,c = 500-1背包问题:装⼊物品2、3,最⼤价值220背包问题:装⼊物品1、2和2-3的物品3,最⼤价值240(贪⼼算法)贪⼼算法⽆法求解0-1背包问题,按贪⼼算法,0-1背包问题将装⼊物品1和2贪⼼与局部最优思考:为什么0-1背包可以⽤动态规划?⽽不能⽤贪⼼算法贪⼼易陷⼊局部最优好⽐“以最快的速度下⼭”,每步都选择最快不见得⼀定到达⼭脚局部最优是指解在⼀定范围或区域内是最优的,或求解问题的⽅法在⼀定限制条件下是最优的⼀般的启发式算法、贪⼼算法或局部算法都很容易产⽣局部最优局部最优通常是⽆法查证的获得局部最解的复杂度远低于全局最优解找钱问题:15元找零11之后,不存在⾯值为4元的零钱0-1背包问题:50容量的背包装⼊前两个物品仍剩余20容量的空间活动安排问题:若限制教室使⽤的总时间贪⼼算法与动态规划贪⼼算法和动态规划都具有最优⼦结构贪⼼算法是⾃顶向下的,只查看了当前状态;⽽动态规划⾃底向上地求解了最优解包含的所有⼦问题最优装载问题描述:⼀批集装箱要装上⼀艘载重量为 c 的轮船,其中集装箱 i 的重量为 Wi ,不考虑体积,将尽可能多的集装箱装上轮船贪⼼:重量轻者先装思考:与0-1背包问题有什么不同?设 x = (x1, x2, … , xn) 是最优装载问题的最优解(贪⼼算法)贪⼼选择性质:设y = (y1, y2, … , yn) 是⼀个最优解,其第⼀个不为0的选择为 yk = 1,则将物品 k 替换成物品1,仍满⾜容量限制,替换⽅案就构成了原问题的另⼀个最优解最优⼦结构性质:考虑去掉物品1后的⼦问题哈夫曼编码Huffman编码是⼀种可变字长编码,⼀种构建极⼩多余编码的⽅法⼀篇包含6种字符的⽂档中将串001011101解码为aabe定义平均码长为求⽂档 C 的哈夫曼编码就等价于构建⼀棵最优完全⼆叉树,使得平均码长最⼩即⽂档 C 的最优前缀码贪⼼算法:依次将最⼩频率的节点两两合并单源最短路径问题描述:设⼀个带权的有向图 G = (V, E)求从源顶点 V1属于 V 到其他顶点的最短路径Dijkstra 算法⼜称为标号法T标号:临时标号(tentative label),表⽰到源顶点的路径还可以进⼀步降低,有待探查P标号:永久标号(permanent label),表⽰已经找到源顶点的最短路径,不再探查当所有顶点的标号变成P标号时,算法结束,即算法最多需要 n - 1 步初始:给起点⼀个 P 标号 0,其他顶点为⽆穷⼤的 T 标号更新:若顶点 Vi 最近获得了P标号,考查与其有弧 eij 相连的顶点Vj,若 Vj 仍是 T 标号,更新其 T 标号为决策:在所有 T 标号中,选择⼀个值最⼩的顶点,令其变为 P 标号Dijkstra 算法为什么没有陷⼊局部最优?贪⼼:决策总是在所有T标号的顶点中选择最⼩最⼩⽣成树给定⽆向图 G = (V, E),称G‘ = (V’,E‘)是 G 的⼀个⼦图,若V’ 包含于 V,E’包含于 E。

贪 心 算 法

贪 心 算 法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

贪心算法经典例题

贪心算法经典例题

贪心算法经典例题所谓贪心算法指的是为了解决在不回溯的前提之下,找出整体最优或者接近最优解的这样一种类型的问题而设计出来的算法。

贪心算法的基本思想是找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解。

因此能够使用贪心算法的问题必须满足下面的两个性质:1.整体的最优解可以通过局部的最优解来求出;2.一个整体能够被分为多个局部,并且这些局部都能够求出最优解。

使用贪心算法当中的两个典型问题是活动安排问题和背包问题。

利用贪心算法解题,需要解决两个问题:一是问题是否适合用贪心法求解。

我们看一个找币的例子,如果一个货币系统有3种币值,面值分别为一角、五分和一分,求最小找币数时,可以用贪心法求解;如果将这三种币值改为一角一分、五分和一分,就不能使用贪心法求解。

用贪心法解题很方便,但它的适用范围很小,判断一个问题是否适合用贪心法求解,目前还没有一个通用的方法,在信息学竞赛中,需要凭个人的经验来判断何时该使用贪心算法。

二是确定了可以用贪心算法之后,如何选择一个贪心标准,才能保证得到问题的最优解。

在选择贪心标准时,我们要对所选的贪心标准进行验证才能使用,不要被表面上看似正确的贪心标准所迷惑,如下面的例子。

例2 (NOIP1998tg)设有n个正整数,将他们连接成一排,组成一个最大的多位整数。

例如:n=3时,3个整数13,312,343,连成的最大整数为:34331213又如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613 输入:NN个数输出:连接成的多位数算法分析:此题很容易想到使用贪心法,在考试时有很多同学把整数按从大到小的顺序连接起来,测试题目的例子也都符合,但最后测试的结果却不全对。

按这种贪心标准,我们很容易找到反例:12,121 应该组成12121而非12112,那么是不是相互包含的时候就从小到大呢?也不一定,如:12,123 就是12312而非12112,这样情况就有很多种了。

第五讲 贪心算法


• 下面来看看0-1背包问题。 • 给定一个最大载重量为M的卡车和N种动 物。已知第i种动物的重量为Wi,其最大价 值为Vi,设定M,Wi,Vi均为整数,编程确 定一个装货方案,使得装入卡车中的所有 动物总价值最大。
• • • •

• •
分析:对于N种动物,要么被装,要么不装,也就是说在满足 卡车载重的条件下,如何选择动物,使得动物价值最大的问题。 即确定一组X1,X2,…,Xn, Xi∈{0,1} f(x)=max(∑Xi*Vi) 其中,∑(Xi*Wi)≦W 从直观上来看,我们可以按照上例一样选择那些价值大,而重 量轻的动物。也就是可以按价值质量比(Vi/Wi)的大小来进行 选择。可以看出,每做一次选择,都是从剩下的动物中选择那些 Vi/Wi最大的,这种局部最优的选择是否能满足全局最优呢?我 们来看看一个简单的例子: 设N=3,卡车最大载重量是100,三种动物A、B、C的重量分 别是40,50,70,其对应的总价值分别是80、100、150。 情况A:按照上述思路,三种动物的Vi选择动物C,得到价值150,然后任意选择A或B, 由于卡车最大载重为100,因此卡车不能装载其他动物。 情况B:不按上述约束条件,直接选择A和B。可以得到价值 80+100=180,卡车装载的重量为40+50=90。没有超过卡车的实 际载重,因此也是一种可行解,显然,这种解比上一种解要优化。
二、应用举例
• 例1:部分背包问题 • 给定一个最大载重量为M的卡车和N种食 品,有食盐,白糖,大米等。已知第i种食 品的最多拥有Wi公斤,其商品价值为Pi, 编程确定一个装货方案,使得装入卡车中 的所有物品总价值最大。

分析:因为每一个物品都可以分割成单位 块,单位块的利益越大显然总收益越大,所 以它局部最优满足全局最优,可以用贪心法 解答,方法如下:先将单位块收益按从大到 小进行排列,然后用循环从单位块收益最大 的取起,直到不能取为止便得到了最优解。

贪心算法例题简单说明

贪⼼算法例题简单说明
1.选择不相交区间问题
贪⼼思路:按照结束时间的顺序排序,结束时间越早,后⾯就能放越多的事。

2.区间选点问题
贪⼼思路:从前往后扫每个区间的树⽊,数⽬的那个区间,从后往前种树。

3.区间覆盖问题
贪⼼思路:预处理完了之后,要找到右端点坐标最⼤的⼀个,直到到边。

这⾥我就要说⼀下了⼀定要注意上下的边界问题:
1.两个圆相切肯定不对,覆盖不全
2.覆盖圆与边相切也不对,覆盖不全
4.流⽔作业调度问题
贪⼼思路:
5.带期限和带罚款的单位时间任务调度
贪⼼思路:罚款越⼤,越要完成,所以罚款⼤的要先处理,将罚款⼤的放在能放区间的最后。

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

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

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

该算法存在问题: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贪心算法实例

1贪心算法实例贪心算法是一种在每个阶段选择最优解,以期望使最终解也是最优的算法。

它通常不与动态规划相比较,而是作为其一种快速解决方案的方法。

下面我将为你介绍一个贪心算法的实例:最小硬币找零问题。

在现实生活中,我们经常会遇到需要找零的情况,比如给顾客找最少的硬币来凑齐一定金额。

最小硬币找零问题就是通过贪心算法来解决这个问题,即每次找零都找剩下金额中数量最大的硬币。

假设有以下几种硬币:25分、10分、5分和1分。

假设需要找零的金额是41分。

那么贪心算法的实现步骤如下:1.初始化一个空的结果集,用来保存找零的硬币。

2.从最大的硬币开始,即25分硬币。

将41分除以25分硬币,得到商为1和余数为163.将1个25分硬币加入结果集,将16分作为新的待找零金额。

4.接下来选择10分硬币,将16分除以10分硬币,得到商为1和余数为65.将1个10分硬币加入结果集,将6分作为新的待找零金额。

6.再选择5分硬币,将6分除以5分硬币,得到商为1和余数为17.将1个5分硬币加入结果集,将1分作为新的待找零金额。

8.最后选择1分硬币,将1分除以1分硬币,得到商为1和余数为0。

9.将1个1分硬币加入结果集,此时余数为0,找零完毕。

10.返回结果集。

以上就是用贪心算法解决最小硬币找零问题的步骤。

贪心算法的关键是每次选择最优解,即选择剩下金额中数量最大的硬币。

这样就能保证每次找零都尽可能少地使用硬币数量。

然而,贪心算法并不是适用于所有问题的解决方案。

因为它每次只考虑局部最优解,而没有考虑全局最优解。

在一些情况下,使用贪心算法可能得到次优解或者无解。

总结来说,贪心算法是一种简单、高效的算法思想,适用于一些特定的优化问题。

但对于一些复杂的问题,还是需要综合考虑动态规划等其他算法来得到最优解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档