数学模型_贪心算法及实例
- 格式:ppt
- 大小:364.00 KB
- 文档页数:7
在现代数学建模中,动态规划和贪心算法是两种常用的方法。
它们具有重要的理论和实际意义,可以在很多实际问题中得到应用。
动态规划是一种通过将问题分解为子问题,并反复求解子问题来求解整个问题的方法。
它的核心思想是将原问题分解为若干个规模较小的子问题,并将子问题的最优解合并得到原问题的最优解。
动态规划的求解过程通常包括问题的建模、状态的定义、状态转移方程的确定、初始条件的设置和最优解的确定等步骤。
通过动态规划方法,可以大大减少问题的求解时间,提高求解效率。
举个例子,假设我们有一组物品,每个物品有重量和价值两个属性。
我们希望从中选出一些物品放入背包中,使得在背包容量限定的条件下,背包中的物品的总价值最大化。
这个问题可以使用动态规划来解决。
首先,我们定义一个状态变量,表示当前的背包容量和可选择的物品。
然后,我们根据背包容量和可选择的物品进行状态转移,将问题分解为子问题,求解子问题的最优解。
最后,根据最优解的状态,确定原问题的最优解。
与动态规划相比,贪心算法更加简单直接。
贪心算法是一种通过每一步的局部最优选择来达到全局最优解的方法。
贪心算法的核心思想是每一步都做出当前看来最好的选择,并在此基础上构造整个问题的最优解。
贪心算法一般包括问题的建模、贪心策略的确定和解的构造等步骤。
尽管贪心算法不能保证在所有情况下得到最优解,但在一些特定情况下,它可以得到最优解。
举个例子,假设我们要找零钱,现有的零钱包括若干2元、5元和10元的硬币。
我们希望找出一种最少的方案来凑出某个金额。
这个问题可以使用贪心算法来解决。
首先,我们确定贪心策略,即每次选择最大面额的硬币。
然后,我们根据贪心策略进行解的构造,直到凑够目标金额。
动态规划和贪心算法在数学建模中的应用广泛,在实际问题中也有很多的成功应用。
例如,动态规划可以用于求解最短路径、最小生成树等问题;贪心算法可以用于求解调度、路径规划等问题。
同时,动态规划和贪心算法也相互补充和影响。
有一些问题既可以使用动态规划求解,也可以使用贪心算法求解。
贪心算法实例分析贪心算法,是一种常见的解决问题的方法,尤其在最优化问题中得到了广泛的应用。
简单来说,贪心算法是建立在选取局部最优解的基础上,通过不断的贪心选择,达到全局最优解的目的。
本文将通过两个实例,介绍使用贪心算法的思路和实现方法。
实例一:零钱兑换问题假设有 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 大于等于当前区间的所有区间,直到所有区间都被检查完。
列举用贪心算法求解的经典问题贪心算法是一种简单而高效的问题求解方法,通常用于求解最优化问题。
它通过每一步选择当前状态下的最优解,最终得到全局最优解。
贪心算法的核心思想是:每一步都做出一个局部最优的选择,并认为这个选择一定可以达到全局最优。
以下是一些经典问题,可以用贪心算法求解:1. 零钱兑换问题(Coin Change Problem):给定一些不同面额的硬币和一个目标金额,找到最少的硬币数量,使得硬币总额等于目标金额。
贪心算法可以按照硬币的面额从大到小进行选择,每次选择尽量大面额的硬币。
2. 区间调度问题(Interval Scheduling Problem):给定一些区间,找到最多的不相交区间。
贪心算法可以按照区间的结束时间进行排序,每次选择结束时间最早的区间,确保选择的区间不重叠。
3. 分糖果问题(Candy Problem):给定一个数组表示每个孩子的评分,要求给这些孩子分糖果,满足以下要求:每个孩子至少分到一个糖果,评分高的孩子要比相邻孩子分到的糖果多。
贪心算法可以从左到右进行两次遍历,分别处理评分递增和评分递减的情况。
4. 跳跃游戏问题(Jump Game Problem):给定一个非负整数数组,表示每个位置的最大跳跃长度,判断是否能从第一个位置跳到最后一个位置。
贪心算法可以记录当前能够到达的最远位置,并且更新为更远的位置。
5. 任务调度器问题(Task Scheduler Problem):给定一串任务,每个任务需要一定的冷却时间,要求以最短的时间完成所有任务。
贪心算法可以按照出现次数进行排序,优先执行出现次数最多的任务,并在冷却时间内执行其他任务。
6. 区间覆盖问题(Interval Covering Problem):给定一些区间,找到最少的区间数,使得它们的并集覆盖了所有输入区间。
贪心算法可以根据区间的起始位置进行排序,每次选择最早结束的区间,并将它添加到最终结果中。
以上仅是一些经典问题的例子,实际上还有很多问题可以用贪心算法来求解。
因为贪心而失败的例子贪心算法是一种常用的解决问题的算法思想,它通常在每一步选择中都采取当前状态下最好或最优的选择,从而希望最终能够达到全局最优的结果。
然而,贪心算法的贪心选择可能会导致最终结果并非全局最优,而是局部最优或者根本无法得到可行解。
因此,贪心算法在某些问题上会因为贪心而失败。
下面将列举10个因为贪心而失败的例子。
1. 颜色分配问题:假设有n个节点需要着色,并且相邻的节点不能具有相同的颜色。
贪心算法选择每次都选择可用颜色最少的节点进行着色。
然而,这种贪心选择可能会导致最终无法着色所有节点,因为后续节点的颜色选择受到前面节点的限制。
2. 找零问题:假设需要找零的金额为m,而只有面额为1元、5元、10元的硬币。
贪心算法选择每次都选择面额最大的硬币进行找零。
然而,在某些情况下,贪心选择可能会导致找零的硬币数量不是最小的。
3. 最小生成树问题:在一个连通图中,选择一些边构成一个树,使得这些边的权值之和最小,同时保证图中的所有节点都能够通过这些边连通。
贪心算法选择每次都选择权值最小的边加入到树中。
然而,这种贪心选择可能会导致最终得到的树不是最小生成树。
4. 背包问题:给定一组物品,每个物品有自己的重量和价值,在给定的背包容量下,选择一些物品放入背包中,使得背包中物品的总价值最大。
贪心算法选择每次都选择单位重量价值最大的物品放入背包中。
然而,在某些情况下,贪心选择可能会导致最终得到的背包价值不是最大的。
5. 最短路径问题:在一个有向图中,找到两个节点之间的最短路径。
贪心算法选择每次都选择距离最近的节点进行扩展。
然而,这种贪心选择可能会导致最终得到的路径不是最短的。
6. 任务调度问题:给定一组任务,每个任务有自己的开始时间和结束时间,在给定的时间段内,选择一些任务进行调度,使得能够完成尽可能多的任务。
贪心算法选择每次都选择结束时间最早的任务进行调度。
然而,在某些情况下,贪心选择可能会导致最终完成的任务数量不是最多的。
数学建模贪心算法贪心算法是一种常用的数学建模方法,它在解决问题时采用一种“贪心”的策略,即每一步都选择当前最优的解决方案,最终达到全局最优解。
贪心算法在很多实际问题中都有广泛的应用,比如任务调度、背包问题等。
在本文中,我们将介绍贪心算法的基本思想和应用,并通过几个实际问题的例子来展示贪心算法的具体应用过程。
贪心算法的基本思想是通过局部最优解逐步推导出全局最优解。
在每一步的选择中,贪心算法总是选择当前状态下的最优解决方案,而不考虑之后的选择可能会带来的影响。
这意味着贪心算法没有回溯或者重新考虑之前的选择,它只关注当前的局部最优解。
贪心算法的应用非常广泛,其中一种常见的应用是任务调度问题。
假设有n个任务需要在一台计算机上执行,每个任务需要一定的时间和资源。
我们的目标是在不超过计算机资源限制的情况下,尽可能多地执行任务。
贪心算法可以通过选择执行时间最短的任务来实现最优解。
每次选择执行时间最短的任务,直到计算机资源达到限制或者所有任务都执行完毕。
另一个常见的应用是背包问题。
背包问题是指给定一个背包和一组物品,每个物品都有自己的重量和价值。
我们的目标是选择一些物品放入背包中,使得背包中的物品总价值最大化,同时不能超过背包的承重限制。
贪心算法可以通过选择单位重量价值最高的物品来实现最优解。
每次选择单位重量价值最高的物品放入背包,直到背包已满或者所有物品都放入背包。
除了任务调度和背包问题,贪心算法还可以应用于一些其他的实际问题。
比如在路径规划中,贪心算法可以通过选择当前最短路径上的下一个节点来实现最优解。
在图着色问题中,贪心算法可以通过选择当前节点的邻居节点中未被着色的颜色来实现最优解。
虽然贪心算法在很多问题中都能得到较好的结果,但并不是所有问题都适合用贪心算法求解。
有些问题可能存在局部最优解并不一定能得到全局最优解的情况,这时就需要使用其他的算法来求解。
此外,贪心算法的求解过程比较简单,但并不一定能得到最优解,只能得到一个近似解。
c++贪心算法经典例题和详解贪心算法(Greedy Algorithm)是一种优化问题解决方法,其基本思想是每一步都选择当前状态下的最优解,以期望达到全局最优解。
贪心算法的特点是每一步都要做出一个局部最优的选择,而这些局部最优选择最终构成了全局最优解。
下面是一个经典的贪心算法例题以及详解:例题:活动选择问题(Activity Selection Problem)假设有一个需要在同一时段使用同一个资源的活动集合,每个活动都有一个开始时间和结束时间。
设计一个算法,使得能够安排最多数量的互不相交的活动。
# 输入:-活动的开始时间数组`start[]`。
-活动的结束时间数组`end[]`。
# 输出:-选择的互不相交的活动的最大数量。
# 算法详解:1. 首先,将活动按照结束时间从小到大排序。
2. 选择第一个活动,并将其加入最终选择的集合中。
3. 对于剩下的活动,选择下一个结束时间最早且与前一个活动不冲突的活动。
4. 重复步骤3,直到所有活动都被选择。
```cpp#include <iostream>#include <algorithm>#include <vector>using namespace std;// 定义活动结构体struct Activity {int start, end;};// 比较函数,用于排序bool compareActivities(Activity a, Activity b) {return a.end < b.end;}// 贪心算法解决活动选择问题void activitySelection(vector<Activity>& activities) {// 按照结束时间排序sort(activities.begin(), activities.end(), compareActivities);// 第一个活动总是被选中cout << "Selected activity: (" << activities[0].start << ", " << activities[0].end << ")" << endl;// 选择其余活动int lastSelected = 0;for (int i = 1; i < activities.size(); i++) {// 如果当前活动的开始时间大于等于上一个选择的活动的结束时间,则选择该活动if (activities[i].start >= activities[lastSelected].end) {cout << "Selected activity: (" << activities[i].start << ", " << activities[i].end << ")" << endl;lastSelected = i;}}}int main() {vector<Activity> activities = {{1, 2}, {3, 4}, {0, 6}, {5, 7}, {8, 9}, {5, 9}};cout << "Activities before sorting:" << endl;for (const Activity& activity : activities) {cout << "(" << activity.start << ", " << activity.end << ") ";}cout << endl;activitySelection(activities);return 0;}```在这个例子中,我们首先定义了一个活动的结构体`Activity`,然后编写了一个比较函数`compareActivities` 用于排序。
贪心算法的应用案例贪心算法是一种简单直观的算法策略,用于解决一些优化问题。
它的基本思想是在每一步选择中都选择当前状态下的最优解,以期望最终达到全局最优解。
本文将通过几个具体的应用案例来展示贪心算法的实际应用。
1. 最小生成树问题最小生成树问题是图论中经典的问题之一,主要涉及到如何在一个连通加权无向图中找到一个包含所有顶点且权重最小的树。
其中,贪心算法的应用使得问题的解决更加高效。
例如,我们有一个城市网络,城市之间的距离用边的权重表示,我们希望在城市之间建立最小的铁路网络以确保每个城市都能够连通。
这可以转化为一个最小生成树问题,其中贪心算法通过选择权重最小的边,快速找到最优解。
2. 零钱兑换问题零钱兑换问题是一个经典的动态规划问题,但同样可以使用贪心算法来解决。
给定一定面值的硬币,我们需要找零某个金额的钱,求出所需硬币的最少数量。
贪心算法解决这个问题的思路是,每次选择价值最大的硬币,直到凑够所需的金额。
这样可以保证得到的结果是最优解。
例如,假设我们有面值为[1, 5, 10, 25]的硬币,需要凑够30美分,贪心算法会优先选择25美分硬币,然后再选择5美分硬币,最后选择1美分硬币,总共需要三枚硬币。
贪心算法快速获得了最优解。
3. 区间调度问题区间调度问题是一类经典的贪心算法问题,主要涉及到如何在一组任务中选择最大数量的相容任务。
每个任务都有一个开始时间和结束时间,任务之间不能同时进行,我们需要找到最大数量的任务能够不发生冲突地进行。
贪心算法解决这个问题的思路是,每次选择结束时间最早的任务,然后排除与其冲突的任务,直到没有任务可选为止。
这样就能够保证选择的任务最多且不发生冲突。
例如,假设我们有以下任务与其对应的开始时间和结束时间:A(1, 4),B(3, 6),C(5, 7)。
贪心算法会先选择A(1, 4),然后排除与其冲突的任务B(3, 6),最后剩下任务C(5, 7)。
贪心算法得到了最大数量的相容任务。
贪心算法求解程序存储问题的数学模型
通常,贪心算法是可以用来求解程序存储问题的数学模型。
程序存储问题是指在有限的存储空间中放置最多的程序。
假设有一个存储空间大小为N,要存储的程序有n个,每个程序占用存储空间的大小为 si(i=1,2……,n)。
我们可以建立一个数学模型来求解程序存储问题,即:
最大化∑si
且∑si≤N
其中si ≥ 0, i = 1, 2, …, n。
为了求解上述的数学模型,我们可以采用贪心算法,其思想是:从n个程序中依次取出,使存储空间剩余的空间最小,同时它的大小不超过N。
算法过程如下:
①从n个程序中选取最大的程序,记为s1 。
②计算剩余的存储空间 S = N - s1;
③从n-1个剩余的程序中选取最大的程序,记为s2;
④若s2 ≤ S,则将s2存放在存储空间中,并将新的剩余空间记为S = S -s2;否则跳过步骤③;
⑤重复步骤③④,直到所有程序都存放完毕。
采用贪心算法求解程序存储问题的数学模型,能够有效地求解出一组最佳解,从而使得最大存储空间得到实现。
- 1 -。
贪⼼算法例题简单说明
1.选择不相交区间问题
贪⼼思路:按照结束时间的顺序排序,结束时间越早,后⾯就能放越多的事。
2.区间选点问题
贪⼼思路:从前往后扫每个区间的树⽊,数⽬的那个区间,从后往前种树。
3.区间覆盖问题
贪⼼思路:预处理完了之后,要找到右端点坐标最⼤的⼀个,直到到边。
这⾥我就要说⼀下了⼀定要注意上下的边界问题:
1.两个圆相切肯定不对,覆盖不全
2.覆盖圆与边相切也不对,覆盖不全
4.流⽔作业调度问题
贪⼼思路:
5.带期限和带罚款的单位时间任务调度
贪⼼思路:罚款越⼤,越要完成,所以罚款⼤的要先处理,将罚款⼤的放在能放区间的最后。
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. 分发糖果
给定一个数组 ratings,表示一群孩子的评分,现在需要给这些孩子分发糖果。
规定每个孩子至少分配到一个糖果,且评分更高的孩子必须得到更多的糖果。
问最少需要准备多少个糖果。
2. 会议室安排
给定一组会议,每个会议有开始时间和结束时间,现在需要在有限的会议室内安排这些会议,使得尽可能多的会议得以举行。
请问最多可以安排多少个会议。
3. 分割回文串
给定一个字符串 s,将其分割成一些子串,使得每个子串都是回文串。
请问最少需要分割多少次。
4. 零钱兑换
给定一组硬币的面值和一个总金额 amount,现在需要用这些硬币来找零。
请问最少需要多少个硬币才能凑出总金额。
以上例题均可以使用贪心法来解决,具体实现方式需要根据题目要求进行调整。
贪心法在实际应用中的效果取决于问题本身的特点,不适用于所有问题。
- 1 -。
贪心算法的例子
贪心算法是一种解决优化问题的算法,它通常用于在一组选择中作出最优决策。
在贪心算法中,每次选择都是当前状态下的最优解,而不考虑将来可能出现的情况。
下面是一些贪心算法的例子。
1. 零钱兑换问题
假设你有一些硬币,每个硬币的面值分别为1、5、10、50、100。
现在要找零n元,最少需要多少个硬币呢?在贪心算法中,我们每次选择最大面值的硬币,直到凑够n元为止。
2. 区间覆盖问题
假设你有一些区间,每个区间用起点和终点表示。
现在要用尽可能少的区间覆盖所有的点,怎么办?在贪心算法中,我们每次选择覆盖范围最大的区间,直到所有点都被覆盖为止。
3. 最小生成树问题
假设你有一个连通无向图,每条边都有一个权值。
现在要选择一些边,构成一棵树,使得总权值最小,怎么办?在贪心算法中,我们每次选择与当前树相连的边中,权值最小的边,直到所有点都被覆盖为止。
4. 背包问题
假设你有一个背包,容量为C,有一些物品,每个物品有重量w 和价值v。
现在要选择一些物品,放入背包中,使得总重量不超过C,总价值最大,怎么办?在贪心算法中,我们每次选择单位价值最大的物品,直到背包装满为止。
这些都是贪心算法的例子,贪心算法虽然看起来简单,但是它在某些情况下可以得到最优解,而且时间复杂度也比较低。
迪杰斯特拉算法贪心数学模型-回复迪杰斯特拉算法是一种解决最短路径问题的贪心算法,其基本原理是通过每次选择当前路径最短的顶点来实现的。
在本文中,我们将重点讨论迪杰斯特拉算法在数学模型中的应用。
首先,让我们来了解一下最短路径问题的定义。
给定一个加权有向图,其中每个边都有一个非负权值,我们需要找到从起点到终点的最短路径。
最短路径的定义是指路径上所有边的权值之和最小。
接下来,我们将介绍迪杰斯特拉算法的具体步骤。
假设有一个图G,其中包含N个顶点和M个边。
我们定义一个数组dist[],其中dist[i]表示从起点到顶点i的当前最短路径的权值之和。
初始时,将dist[起点]设为0,其余元素设为无穷大。
1. 首先,选择起点作为当前顶点,并将其标记为已访问。
2. 遍历与当前顶点相邻的顶点,计算从起点经过当前顶点到达相邻顶点的路径权值之和。
如果该路径权值之和小于dist[相邻顶点],则更新dist[相邻顶点]的值。
3. 从未访问的顶点中选择dist值最小的顶点作为下一个当前顶点,并将其标记为已访问。
4. 重复步骤2和步骤3,直到所有顶点都被访问或者无法再选择新的当前顶点。
举个例子来说明迪杰斯特拉算法的应用。
假设我们有一个加权有向图G,其中包含5个顶点分别为A、B、C、D和E,以及6条边,每条边的权值如下所示:A->B: 2A->C: 5B->C: 1B->D: 6C->D: 3D->E: 4现在我们需要从顶点A到达顶点E的最短路径。
我们可以按照上述步骤来计算最短路径。
首先,初始化dist数组为[0, ∞, ∞, ∞, ∞],表示从起点到各顶点的当前最短路径的权值之和。
选择起点A作为当前顶点。
然后,计算从起点A经过当前顶点A到达相邻顶点B和C的路径权值之和。
路径A->B的权值之和为2,小于dist[相邻顶点B]的值,因此更新dist[相邻顶点B]为2。
路径A->C的权值之和为5,小于dist[相邻顶点C]的值,因此更新dist[相邻顶点C]为5。
贪⼼算法+实例贪⼼算法(⼜称贪婪算法)是指,在对时,总是做出在当前看来是最好的选择。
也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部。
(官⽅解释)。
所谓的贪⼼算法主要理解就在这个“贪⼼”上⾯,所谓贪⼼,就是找到最好的,也就是上⾯说的最优解。
我们可以通过各种⽅式找到当前的最优解,将最有解利⽤过后,将其清除,再去找下⼀个最优解。
来⼀个例⼦来说明。
题⽬描述鲁宾逊先⽣有⼀只宠物猴,名叫多多。
这天,他们两个正沿着乡间⼩路散步,突然发现路边的告⽰牌上贴着⼀张⼩⼩的纸条:“欢迎免费品尝我种的花⽣!――熊字”。
鲁宾逊先⽣和多多都很开⼼,因为花⽣正是他们的最爱。
在告⽰牌背后,路边真的有⼀块花⽣⽥,花⽣植株整齐地排列成矩形⽹格(如图111)。
有经验的多多⼀眼就能看出,每棵花⽣植株下的花⽣有多少。
为了训练多多的算术,鲁宾逊先⽣说:“你先找出花⽣最多的植株,去采摘它的花⽣;然后再找出剩下的植株⾥花⽣最多的,去采摘它的花⽣;依此类推,不过你⼀定要在我限定的时间内回到路边。
”我们假定多多在每个单位时间内,可以做下列四件事情中的⼀件:1) 从路边跳到最靠近路边(即第⼀⾏)的某棵花⽣植株;2) 从⼀棵植株跳到前后左右与之相邻的另⼀棵植株;3) 采摘⼀棵植株下的花⽣;4) 从最靠近路边(即第⼀⾏)的某棵花⽣植株跳回路边。
现在给定⼀块花⽣⽥的⼤⼩和花⽣的分布,请问在限定时间内,多多最多可以采到多少个花⽣?注意可能只有部分植株下⾯长有花⽣,假设这些植株下的花⽣个数各不相同。
例如在图2所⽰的花⽣⽥⾥,只有位于(2,5),(3,7),(4,2),(5,4)(2, 5), (3, 7), (4, 2), (5, 4)(2,5),(3,7),(4,2),(5,4)的植株下长有花⽣,个数分别为13,7,15,913, 7, 15, 913,7,15,9。
沿着图⽰的路线,多多在212121个单位时间内,最多可以采到373737个花⽣。
贪⼼算法-例题讲解前⾔:此博客在写作过程中参考了⼤量资料和博客,不能⼀⼀列举,还请见谅。
概述贪⼼法:从问题的某⼀个初始状态出发,逐步构造最优解从⽽向⽬标前进,并期望通过这种⽅法产⽣出⼀个全局最优解的⽅法贪⼼是⼀种解题策略,也是⼀种解题思想,⽽不是算法贪⼼策略与其他算法的区别贪⼼与递推:贪⼼法推进每⼀步不依据某⼀固定的递推式,⽽是当前看似最佳的贪⼼决策,不断的将问题归纳为更加⼩的相似的⼦问题贪⼼与动态规划:贪⼼是“⿏⽬⼨光”;动态规划是“统揽全局”贪⼼法的优缺点优点:思维复杂度低、代码量⼩、运⾏效率⾼、空间复杂度低等缺点:很难找到⼀个简单可⾏并且保证正确的贪⼼思路贪⼼算法的应⽤贪⼼算法的常⽤范围有明显的贪⼼可证明贪⼼策略的贪⼼(最常见的)贪⼼数据结构:堆/Kruskal/Prim/Dijkstra博弈/游戏策略,这些策略⼤多是贪⼼求较优解或多次逼近求最优解⼏个简单的贪⼼例⼦最优装载问题:给n个物体,第i个物体重量为wi,选择尽量多的物体,使得总重量不超过C贪⼼策略:先拿轻的部分背包问题:有n个物体,第i个物体的重量为wi,价值为vi,在总重量不超过C的情况下让总价值尽量⾼。
每⼀个物体可以只取⾛⼀部分,价值和重量按⽐例计算贪⼼策略:先拿性价⽐⾼的乘船问题:有n个⼈,第i个⼈重量为wi。
每艘船的载重量均为C,最多乘两个⼈。
⽤最少的船装载所有⼈贪⼼策略:最轻的⼈和最重的⼈配对例题(基础)1.删数问题-【问题描述】键盘输⼊⼀个⾼精度的正整数n(n<=240位),去掉其中任意s个数字后剩下的数字按照原来的次序将组成⼀个新的正整数。
编程对给定的n和s,寻求⼀种⽅案,使得剩下组成的新数最⼩。
贪⼼策略为:每⼀步总是选择⼀个使剩下的数最⼩的数字删去,即按⾼位到低位的顺序搜索,若各位数字递增,则删除最后⼀个数字,否则删除第⼀个递减区间的⾸字符。
然后回到串⾸,按上述规则再删除下⼀个数字。
重复以上过程s次,剩下的数字串便是问题的解了。
贪心算法例题
贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。
以下是一个贪心算法的例子:
问题描述:有100个人在一酒吧,一次酒局中大家都决定向其他每个人敬酒,但只有距离较近的人之间才能互敬。
酒局结束后,每人都记录下他们之间互敬了多少次。
现给出所有人的互敬次数,找出互敬次数最多的那个人。
贪心策略:从最多互敬次数的人开始,每次都选择能互敬次数最多的人,直到达到最大互敬次数为止。
具体实现:
1. 首先将所有人的互敬次数存入一个数组中。
2. 从数组中找到互敬次数最多的人,假设其互敬次数为max_times。
3. 从数组中删除所有互敬次数小于max_times的人,因为他们的互敬次数已经确定不会超过max_times。
4. 重复步骤2和3,直到数组为空。
这个贪心算法的例子中,每次选择都是基于当前情况下的最优选择,希望通过这种方式达到全局最优的结果。
贪心算法例子贪心算法是一种常用的算法设计策略,它通过每一步的最优选择来达到整体的最优解。
在贪心算法中,每一次选择都是基于眼前的最优解,而不考虑对未来的影响。
下面我将给出一个贪心算法的例子,以便更好地理解。
假设有一堆硬币,包括 1 元、5 元、10 元、50 元和 100 元,现在我们需要支付 456 元。
如何使用最少的硬币数量来支付呢?我们可以使用贪心算法来解决这个问题。
首先,我们找一个最大的硬币来支付,即 100 元硬币。
然后,我们继续找最大的硬币来支付,即 100 元硬币。
此时,我们还需要支付 256 元。
继续找最大的硬币,即 100 元硬币。
此时,我们还需要支付 156 元。
继续找最大的硬币,即 100 元硬币。
此时,我们还需要支付 56 元。
继续找最大的硬币,即 50 元硬币。
此时,我们还需要支付 6 元。
继续找最大的硬币,即 5 元硬币。
此时,我们还需要支付 1 元。
最后,我们找最大的硬币,即 1 元硬币。
至此,我们完成了支付,总共使用的硬币数量为 4。
通过上述例子可以看出,贪心算法每次都选择最大的硬币来支付,直到支付金额为零。
这种策略可能不一定能够得到最优解,但在某些问题中,贪心算法能够得到接近最优解的结果,并且具有高效性。
贪心算法的应用范围很广,例如最小生成树算法、霍夫曼编码、任务调度等等。
在实际问题中,我们可以根据问题的特点来设计贪心算法,以求得较优的解答。
总而言之,贪心算法是一种简单而实用的算法策略,通过每一步的最优选择来达到整体的最优解。
贪心算法在某些问题中能够得到接近最优解的结果,并且具有高效性。
然而,也需要注意在使用贪心算法时,要仔细分析问题的特点,以确保得到正确的结果。