145
社区成员
发帖
与我相关
我的任务
分享贪心算法通过一系列选择来得到问题的解,所做的每个选择都是当前状态下局部最好选择,即贪心选择。贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。
(1)最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
(2)贪心选择性质:贪心选择性质是指,所求问题的整体最优解可以通过一系列局部最优的选择来达到。
共同点:贪心算法和动态规划算法都要求问题具有最优子结构性质
不同点:动态规划算法:解出相关子问题后,做出选择。贪心算法:仅在当前状态下做出最好选择,即局部最优选择。再去解做出这个选择后产生的相应的子问题。动态规划算法通常以自底向上的方式解各子问题,贪心算法则通常以自顶向下的方式进行,以迭代的方式做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为规模更小的子问题。
相同点:最优子结构性质
不同点:
给定k个排好序的序列s1, $2,…, sg,用2路合并算法将这k个序列合并成一个序列。假设采用的2路合并算法合并2个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
思路:
(1)根据贪心算法的思想,局部最优即全局最优。
(2)最少比较次数为先将长度最短的两个数进行合并,合并后的数字加入数组中然后再次挑选长度最短的两个数合并,每次合并都让记录次数的值进行加法就可以,一直到将所有数据合并完为止。
(3)最多比较次数为先将长度最长的两个数进行合并,合并后的数字加入数组中然后再次挑选长度最长的两个数合并,每次合并都让记录次数的值进行加法就可以,一直到将所有数据合并完为止。
def good(a):
b = a
b.sort()
print('序列长度排序为:', b)
rgood = int(0)
i = int(0)
while (i < n - 1):
rgood = rgood + b[i] + b[i + 1] - 1;
b[i] = b[i] + b[i + 1];
b[i + 1] = 0
i += 1
b.sort()
return rgood
n = int(input("设置需要合并的堆数:"))
k = int(input("设置每次最多合并的堆数:"))
arr = input("分别设置每堆的个数:")
p = [int(i) for i in arr.split()]
p.sort()
max = 0
max_spend = p[n - 1]
for i in range(n - 2, -1, -1):
if p[i] == 0:
break
max_spend += p[i]
max += max_spend
i = 0
min = 0
min_spend = 0
while i < n - 1:
min_spend = 0
p = p + [0]
for j in range(0, k):
min_spend += p[i]
i += 1
p[n] = min_spend
n += 1
min += min_spend
p[i:n] = sorted(p[i:n])
print("最大总费用为:", max, "\n最小总费用为:", min)
牛逼,牛逼!!!我的贾!!!!!!!!!!!!!!!!!!