贾佳 2022222232 第四章作业

ehair 2022-12-30 12:16:46

1·内容及总结

1.1贪心算法概念

      贪心算法通过一系列选择来得到问题的解,所做的每个选择都是当前状态下局部最好选择,即贪心选择。贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。

    贪心算法的基本要素

  (1)最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

  (2)贪心选择性质:贪心选择性质是指,所求问题的整体最优解可以通过一系列局部最优的选择来达到。

贪心算法与动态规划算法的差异

共同点:贪心算法和动态规划算法都要求问题具有最优子结构性质

不同点:动态规划算法:解出相关子问题后,做出选择。贪心算法:仅在当前状态下做出最好选择,即局部最优选择。再去解做出这个选择后产生的相应的子问题。动态规划算法通常以自底向上的方式解各子问题,贪心算法则通常以自顶向下的方式进行,以迭代的方式做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为规模更小的子问题。

2. 以{0-1}背包问题和背包问题为例,讨论动态规划算法与贪心算法的异同。

相同点:最优子结构性质 

不同点:

  • 动态规划算法在每一步所做的选择都依赖与相关子问题的解,因此只有在解出相关子问题时才能做出选择。贪心算法只有在当前状态下做出最好选择,即局部最优选择,然后再去解做出这个选择后产生的相应子问题。
  • 动态规划算法通常是自底向上的方式解各个子问题。而贪心算法通常采用自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。
  •  贪心算法无法解决动态规划的问题,动态规划的问题可以解决贪心算法的问题。但是贪心算法的效率高于动态规划算法。

3. 算法实验2:完成教材114页算法实现题4-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

4·算法实验2:完成教材118页算法实现题4-14总结实验出现问题及解决方法。

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)

 

...全文
189 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
勒布朗詹姆斯 2024-02-01
  • 打赏
  • 举报
回复

牛逼,牛逼!!!我的贾!!!!!!!!!!!!!!!!!!

145

社区成员

发帖
与我相关
我的任务
社区描述
高校教学社区
软件工程 高校
社区管理员
  • dainwnu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧