使用python实现一个贪心算法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
<强>思想强>
贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件,若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。
<强>步骤
强>
- <李>遍历初始集合X中的备选元素李> <李>利用贪心策略在X中确定一个元素,并将其加入到可行解年代中李> <>李得到可行解年代李>
p即为贪心策略,用来选择符合条件的元素。
假设某国硬币面值有1、5、10、25100元五种面额,若店员为顾客找零时,需要给顾客找零=36元,求硬币数最少的情况。
这里我们的贪心策略为:
先找到最接近一个的值,然后对一个进行更新,然后进行循环。
<强>代码实现强>
def shortNum(一个): 硬币=(1、5、10、25100) 出=[] 硬币硬币=[::1) 我的金币: num=//我 出=+[我]* num=a-num *我 如果a<=0: 打破 返回了 一个=36 print (shortNum (a))
<强>问题描述:强>
输入为任务集合X=(r1, r2, r3,…rn),每个任务ri,都对应着一个起始时间ai与结束时间bi
要求输出为最多的相容的任务集。
,如上图,r1与r2相容,r3与r1和r2都不相容。
那么这里的贪心策略我们可以设为:
- <李>先将结束时间最短的任务加入到年代中,李> <李>再从剩下的任务的任务中选择结束时间最短的,且判断与年代集合中的任务是否相容李> <李>若不相容,则换下一个时间最短的任务,并进行比较李> <>李循环,直至X为空。李>
<强>代码实现强>
#任务规划 从进口OrderedDict集合 任务=OrderedDict () 任务(& # 39;r1 # 39;]=[0, 4] 任务(& # 39;r2 # 39;]=[5、8] 任务(& # 39;r3 # 39;]=[10、13] 任务(& # 39;r4 # 39;]=[15、18] 任务(& # 39;r5 # 39;]=[7、11] 任务(& # 39;r6 # 39;]=[2,6] 任务(& # 39;r7 # 39;]=[2,6] 任务(& # 39;r8 # 39;]=[2,6] 任务(& # 39;r9机型# 39;]=(12、16) 任务(& # 39;r10 # 39;]=(12、16) 任务(& # 39;r11 # 39;]=(12、16) 任务(& # 39;r12 # 39;]=[0, 3] listTask=列表(task.items ()) #根据bi进行排序,结束时间早的在前面(冒泡排序) 因为我在范围(len (listTask) 1): j的范围(len (listTask)我): 如果listTask [j][1][1]比;listTask [j + 1] [1] [1]: listTask [j], listTask [j + 1]=listTask [j + 1], listTask [j] 打印(listTask) 出=[] out.append (listTask.pop (0)) def isValid(临时): k范围内(len ()): 如果临时[1][0]& lt;从[k] [1] [1]: #相交 返回假 还真 j的范围(len (listTask)): temp=listTask.pop (0) #判断是否相交 #相交则继续 #不相交则out.append(临时) k范围内(len ()): 如果isValid(临时): out.append(临时) 其他:继续语句可以不写 其他: 继续 print ()
看完上述内容,你们掌握使用python实现一个贪心算法的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!