贪心算法基本思路:算法
贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能得到局部最优解。每一步只考虑一个数据,他的选取应该知足局部优化的条件。若下一个数据和部分最优解连在一块儿再也不是可行解时,就不把该数据添加到部分解中,直到把全部数据枚举完,或者不能再添加算法中止编程
例题一:ide
假设商店老板要找零n元钱,钱币面额有:100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少?优化
#假设商店老板须要找零n元钱,钱币的面额有:100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少? money = [100,50,20,5,1] def change_money(x): change = [0,0,0,0,0] for i,m in enumerate(money): change[i] = x // money[i] x = x % money[i] if x > 0: print("还剩%s" % x) return change print(change_money(356.2))
例题二:spa
一辆汽车加满油后可行驶n千米,旅途中有k个加油站,加油站之间的距离存放在列表l中。汽车要怎么停靠加油才能使加油次数最少?设计
#一辆汽车加满油后可行驶n千米。旅途中有k个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。 #对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数。 def greedy(n,k,l): num = 0 # 表示加油次数 for i in range(k): if l[i] > n: print('no solution') # 若是距离中获得任何一个数值大于n 则没法计算 return i, s = 0, 0 # 利用s进行迭代 while i <= k: s += l[i] if s >= n: # 当局部和大于n时则局部和更新为当前距离 s = l[i] # 贪心意在令每一次加满油以后跑尽量多的距离 num += 1 i += 1 print(num) if __name__ == '__main__': n = 100 k = 5 l = [50, 80, 39, 60, 40, 32] # 表示加油站之间的距离 greedy(n,k,l)
例题三:code
有n个非负整数,将其按照字符串拼接的方式拼接为一个整数。如何拼接能够使得获得的整数最大?如何拼接能够使得获得的整数最小?blog
例:32,94,128,1286,6,71能够拼接出的最大整数为94716321286128,最小整数为12812863267194字符串