贪心法的求解步骤
在分析和求解某个问题时,在每一步的计算选择上都是最优的或者最好的,通过这种方式期望最终的计算的结果也是最优的。也就是说,算法通过先追求局部的最优解,从而寻求整体的最优解。
贪心算法的基本步骤:
1、首先定义问题,确定问题模型是不是适合使用贪心算法,即求解最值问题;
2、将求极值的问题进行拆解,然后对拆解后的每一个子问题进行求解,试图获得当前子问题的局部最优解;
3、所有子问题的局部最优解求解完成后,把这些局部最优解进行汇总合并,得到最终全局的最优解,那么这个最优解就是整个问题的最优解。
通过场景理解算法
概念性的算法描述可能大家都不太好理解,所以需要结合一些实际的场景来进行说明。这里以我们小时候的找零钱的例子来进行切入。虽然现在大家都用手机扫一扫进行支付,已经很久到没碰过钱了,但是并不妨碍找零问题 可帮助我们形象的理解贪心算法的实现过程。
假设你是一家小卖店的老板,你有各种面值大小的零钱,如1块钱、3块钱、5块钱。这个时候有个小朋友过来买东西,他要求你找的零钱要张数最小,这样他的口袋才能装得下。假设我们分别把零钱记为c[0]、c[1]、c[2] …,小朋友拿来买零食的钱我们记为total。那么刚才说的小朋友希望获得最少张数零钱的需求我们就可以把他转化为一个编程求最优解的问题,即给定总数total,求解最少需要几个c相加的和等于给定的总数total。
例子1:
假设给定需要找的零钱为11,当前的零钱为1块、3块、5块。
输入:total=11,c[0]=1,c[1]=3,c[2]=5
输出:3
问题分析
通过提取问题中的关键词“最少”,我们可以明确此问题的实际上就是一个求解最值的问题,只要找到满足条件的最小零钱张数就可以解决找回最少零钱的问题了。想要找到最小的零钱张数,我们最先想到的方法就是进行穷举,列举出来所有可能的满足总数为11的零钱组合。如下图所示,再在这些组合中找到使用零钱张数最少的组合再计算具体的张数,我们就可以获得最终的答案了。但是这显然不是一个好的解决思路。因为如果对应的total很大,我们穷举的结果将会爆发性增长。
那有没有更好的解决办法呢?这时候我们就可以考虑下贪心算法的实现了,找到满足要求的最小张数零钱。既然是找零钱,那么我们可以将问题转换为找到满足总数total的零钱最少需要几个步骤,实际上就是将问题拆分到每次找零钱的小步骤中,而贪心算法的核心就是需要在每个小步骤中贪心寻求局部最优解。因此在找零钱的每个步骤中,都需要找到该步骤中对应的最优解零钱大小,接下来我们来一起看下贪心算法执行过程。这里假设各个面值的零钱比较充足。
在寻找零钱的步骤中,首先获取最大面值为5的零钱(贪心,上来就找最大的),接着发现剩余待找零钱6=11-5,于是继续寻找最大的面值为5的零钱(继续贪心),待找零钱1=6-5。此时只要获取面值为1的零钱就可以完成任务了,再将之前步骤中的结果整合到一起,最终我们得出想要获取total为11的最少张数零钱的大小为3。通过这样的分析,贪心算法是不是也没有那么的复杂。
/**
* @Author: mufeng
* @Date: 2022/5/15 15:33
* @Version: V 1.0.0
* @Description: 计算最小满足条件的零钱张数
*/public class MinChangeCountSolution {
public static void main(String[] args) {
int values[] = {5,5,3,3,1};
System.out.println(getMinChangeCount(11, values));
}
//假设values数组从大到小排列
static int getMinChangeCount(int total, int[] values) {
int rest = total;
int result = 0;
int count = values.length;
// 从大到小遍历所有面值
for (int i = 0; i < count; ++ i) {
//计算需要几张这种面值的零钱
int needCount = rest / values[i];
//计算使用后的余额
rest -= needCount * values[i];
//计数增加
result += needCount;
if (rest == 0) {
return result;
}
}
//没有找到合适的面值
return -1;
}}123456789101112131415161718192021222324252627282930313233123456789101112131415161718192021222324252627282930313233
以上我们分析了贪心算法的大致实现过程,但是实际上还是有问题的。不知道大家有没有发现,由于贪心算法过于贪心,每一个步骤都想要找到局部最优解。那么假如在上面的例子中,我们没有1块钱的零钱,上述代码的返回结果是-1,即没有符合条件的答案。但是实际并非如此,也就是说5,3,3也是满足条件的,但是上述代码却没有找到。
所以上述代码还是有问题的,关键点就在于,当发现没有1元零钱的时候,需要回头去看能不能把第二步骤中的5元零钱换成3元零钱再进行后续的迭代,如果有这样的步骤,那么就可以找到5,3,3这样的组合。
总结
本文主要通过对于贪心算法的描述,并结合实际的找零钱的例子,带大家一起分析了贪心算法的具体实现过程。同时分析了贪心算法存在的不足,即容易陷入局部最优的陷阱无法自拔,导致最终无法给出满足条件的结果,这也是大家以后在使用贪心算法分析问题时特别需要注意的问题。
起分析了贪心算法的具体实现过程。同时分析了贪心算法存在的不足,即容易陷入局部最优的陷阱无法自拔,导致最终无法给出满足条件的结果,这也是大家以后在使用贪心算法分析问题时特别需要注意的问题。
高维智慧:人世间的四个入世心法——刘丰
心法还有一个重要的步骤,就是不断地跟内在高维智慧连接。用的方法就是持咒、诵经、祷告、瑜伽、内观等 。 这是真正心行的一部份。这些心行是跟高维空间连接的关键,如果不能进入我们内在去行的话,或停留在表面,那它只是低维实践,解决不了本质问题。所以心行、心法都是高维实践,而高维实践需要高维实践条件。 如何...
天龙八部明教如何点心法??
水神和火神点出一个就好了,建议点火神.40—80级, 可以把加状态(向阳,神力)和群血战八方所在的心法点高点,PK最好点出无中生有.其它的心法可以不点.80以后就要慢慢升级,慢慢点心法了,因为升90要求所有心法达到80, 这是一个非常漫长的过程.参考资料:如果您的回答是从其他地方引用,请表明出处 ...
天龙八部怎么提高心法
首先,第一步,跑到峨眉山,用寻路(右上角的自动寻路总知道的吧?)找峨眉山的崔绿华,就是地图上在师字旁边的那个武字那里的人,对话选择传授战斗技能,接着你找你想使用的那个技能,比如以绝剑式这个技能为例子好了,这个技能你看是不是在淑女剑法这本心法里,那好我们就开始在崔绿华那里用钱和...
笑傲江湖Ol心法怎么点?
心法分两部分一部分是右边的基础属性,即力道内劲体魄筋骨气海,另一部分是穴位,穴位分基础穴位、通用穴位和门派穴位,每一个穴位都需要满足一定条件的基础属性才能激活,激活后才能加点
下一站江湖圣手心法怎么解锁介绍_下一站江湖圣手心法怎么解锁是什么_百 ...
在《下一站江湖》这款游戏中,圣手心法对于许多玩家来说是个极具吸引力的心法。下面是详细的解锁步骤:首先,从游戏开始,你需要在杭城门口救下谷之雨,然后在武馆中加入队伍。在武馆门口,与馆方旁边的人物交谈,选择黑衣人这条分支任务。接着,前往大地图的太岳区域,继续选择黑衣人,这将带你进入药王...
人生算法 九段心法之闭环
二:个人或企业的能力难以形成闭环。一个烧烤店的成功几率比一个副总裁更高,更容易形成闭环。烧烤店完成选择地址,进原材料,加工处理,销售的步骤。一个副总裁面对企业,他只能做企业一部分的工作,无法完成一个企业整体运营的闭环。 三:不愿意把手弄脏。做策略和规划的事情...
斗罗大陆宗门心法怎么使用
获取宗门心法 宗门心法的获取通常有以下几种途径 宗门任务:完成宗门分配的各种任务,可以获得宗门贡献度,用于交换心法秘籍。宗门商店:使用宗门贡献度在宗门商店购买。师门赠予:在某些特定的游戏剧情节点,师门长老会赠予心法。探索发现:在游戏探索过程中,有机率发现古籍遗留的心法。心法的种类与选择 各...
帮派心法中的分身术学习
我来迟了,你所说的分身术应该是替身术把~~替身术的学习方法如下:1、替身术只有在帮派才能学习,所以当前需要已加入帮派;2、需要帮派的帮主研究好替身术技能;3、研究好后,可以在帮派大厅->帮派状态->心法,选择替身术学习即可。
天龙八部怎么升级心法
天龙八部升级心法的方法步骤:1、首先了解到每个门派都有专门传授武功的NPC;2、选择某一个门派并进入门派;3、进入门派之后,找到提升心法的地方,提升心法的地方一般在门派大地图上显示"武"字的区域;4、然后点击NPC并和NPC对话,打开所有心法;5、最后选择自己要提升的那一本心法,点击学习即可;6、...
打坐入定八步骤
第五步,继续用心倾听耳根之音,明通造化之机,杂念消落。第六步,放松你的眉心、彻底的放松。第七步,一旦你眉心的酥麻感来的时候,低头!什么都不想!感觉有什么东西在喉咙!吞下去!第八步,用你无念之心去觉受你的弦外之音。直到忽然忘了一切!打坐最高的心法就是没有心法。所谓的观呼吸丹田...
示沸冠心: 贪心算法的基本思路如下: 1.建立数学模型来描述问题. 2.把求解的问题分成若干个子问题. 3.对每一子问题求解,得到子问题的局部最优解. 4.把子问题的解局部最优解合成原来解问题的一个解. ---------------------------------------------- 其实归纳起来也就一个类.其他的都是分支
赫山区18540876376: 怎样应用贪心算法求得最优解 - ?
示沸冠心: 动态规划要求..具有最优子结构,记f[i]最优时,f[i - 1]的解也最优...最终可以得到最优解贪心算法,一般只能得到近优解或者局部最优解..
赫山区18540876376: 谁能给我讲一下free pascal的贪心算法什么思路?谢谢 - ?
示沸冠心: ⒈建立数学模型来描述问题.⒉把求解的问题分成若干个子问题.⒊对每一子问题求解,得到子问题的局部最优解.⒋把子问题的解局部最优解合成原来解问题的一个解.实现该算法的过程:从问题的某一初始解出发;while 能朝给定总目标前进一步 do 求出可行解的一个解元素;由所有解元素组合成问题的一个可行解.下面是一个可以试用贪心算法解的题目,贪心解的确不错,可惜不是最优解.
赫山区18540876376: 请教用贪心算法求解数列的极差M问题 - ?
示沸冠心: 假设经(N-3)次变换后得到3个数:a,b,max'(max'≥a≥b),其中max'是(N-2)个数经(N-3)次f变换后所得的最大值,此时有两种求值方式,设其所求值分别为 , ,则有: =(a*b+1)*max'+1, =(a*max'+1)*b+1 所以 - =max'-b≥0若经(...
赫山区18540876376: 用贪心算法解决背包问题 - ?
示沸冠心: 用贪心算法解决背包问题,首先要明白,结果不一定是全局最优的. 对于贪心法而言,首先步骤是找到最优度量标准,我这里的算法采用的最优度量标准是: 收益p/重量w 的值最大者优先放入背包中,所以有算法如下: void GreedyKnapsack(...
赫山区18540876376: 背包问题贪心算法 - ?
示沸冠心: 可以打乱顺序乱贪.可以用模拟退火,神经网络这样的算法找近似值.目前背包问题还没用多项式时间内的解法.
赫山区18540876376: 用贪心算法求解背包问题的最优解. - ?
示沸冠心: 你这个是部分背包么?也就是说物品可以随意分割? 那么可以先算出单位重量物品的价值,然后只要从高价值到低价值放入就行了,按p[i]/w[i]降序排序,然后一件一件加,加满为止! 贪心的思路是:加最少的重量得到更大的价值! 算出单位价值为{6,4,3,2,7,5,2} 加的顺序即为5,1,6,2,3,4/7 如果重量不超过就全部都加,超过就加满为止 不懂可问望采纳! 推荐看dd_engi的背包九讲,神级背包教程!在此膜拜dd_engi神牛~
赫山区18540876376: 5.贪心算法的核心思想.6.什么是递归?什么是迭代?两者的区别,举例说明.7.回溯的含义是什么?举例 - ?
示沸冠心: 1、贪心算法主要是把问题分成很多局部问题,用局部最优解合成整体最优解.因此使用这种算法需要此问题满足两个条件,一个是能够分成多个能够求解的局部问题,第二个就是局部问题的解能够合成最优解.和动态规划、回溯等相比差别就...
赫山区18540876376: 用贪心算法求解换零钱问题 - ?
示沸冠心: 对货币按照面值从大到小排列,先按照最大面值给,然后将剩余的钱用次大的面值给,依此类推即可.
赫山区18540876376: 求一个算法(贪心算法) - ?
示沸冠心: 首先,无所谓哪里密集哪里不密集的说法,这是人为的区分,需要首先遍历全部格子才能确定,是最慢的算法,全部遍历过了就可以得出最优的路线了.既然用贪心算法,为了思考方便,可以假设棋盘无穷大,算法的目的是判断下一步该往右走还...