144
社区成员
发帖
与我相关
我的任务
分享贪心算法思想
贪心算法常用于优化问题近似解的求解。在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。它的求解过程是:从问题的初始状态出发,通过若干次贪心选择而得出问题的最优解。
贪心算法的特点
1.贪心算法在解决问题的策略上目光短浅,只根据当前已有的求解信息做出局部最优选择,而且一旦做出选择,不管将来有什么结果,这个选择都不会改变。
2.贪心法每次所作出的选择只是在某种意义上的局部最优选择,这种局部最优选择并不是总能保证获得问题的整体最优解,但通常能获得近似最优解。
3.在众多的计算机算法中,贪心策略是最能接近人们日常思维的一种解题策略。
4.最优子结构性质:一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
5.贪心选择性质:贪心选择性质是指所求问题的整体最优解可以通过一系列的局部最优选择得到。
贪心酸法的设计
贪心算法实例
活动安排问题 背包问题 哈夫曼编码 单源最短路径 最优装载问题 最小生成树
学习心得
相同点:最优子结构性质
不同点:
给定k个排好序的序列s1, $2,…, sg,用2路合并算法将这k个序列合并成一个序列。假设采用的2路合并算法合并2个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
def Most(num, n):
num1 = num.copy()
num1.sort(reverse=True) # 降序
Times = 0
times = 0
for i in range(n - 2):
times = num1[0] + num1[1]
Times = Times + times - 1
del num1[0]
del num1[0]
num1.append(times)
num1.sort(reverse=True)
times = num1[0] + num1[1] - 1
Times = Times + times
return Times
def Least(num, n):
num2 = num.copy()
num2.sort() # 升序
Times = 0
times = 0
for i in range(n - 2):
times = num2[0] + num2[1]
Times = Times + times - 1
del num2[0]
del num2[0]
num2.append(times)
num2.sort()
times = num2[0] + num2[1] - 1
Times = Times + times
return Times
if __name__ == '__main__':
num = [11, 10, 4, 5,6]
n = len(num)
print(Most(num, n))
print(Least(num, n))
D:\PYC\pythonProject3\venv\Scripts\python.exe D:/PYC/pythonProject/10/7.py
112
77
Process finished with exit code 0
在一个操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次至少选2堆,最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计算出将n堆石子合并成一堆的最大总费用和最小总费用。
n = int(input("请输入需要合并的石子堆数:"))
k = int(input("请输入每次最多合并的石子堆数:"))
arr=input("请输入每堆石子的个数:")
p =[int(i) for i in arr.split()]
p.sort()
#最大总费用
max = 0;
max1 = p[n-1];
for i in range(n-2,-1,-1):
if p[i] == 0:
break
max1 += p[i]
max += max1
#最小总费用
i=0
min = 0
min1 = 0
while i<n-1:
min1=0;
p = p + [0]
for j in range(0,k):
min1+=p[i]
i+=1
p[n]=min1
n+=1
min+=min1;
#将i-n部分排序
p[i:n] = sorted(p[i:n])
print("最大总费用为:" ,max ,"\n最小总费用为:" , min )
D:\PYC\pythonProject3\venv\Scripts\python.exe D:/PYC/pythonProject/10/7.py
请输入需要合并的石子堆数:6
请输入每次最多合并的石子堆数:2
请输入每堆石子的个数:11 22 33 44 55 66
最大总费用为: 935
最小总费用为: 561
Process finished with exit code 0