Python算法分析与设计实验:贪心算法

Python算法分析与设计实验:贪心算法

一、实验目的
1、了解贪心算法求解优化问题的过程
2、熟练掌握利用贪心算法求解典型的计算问题,如硬币找零、间隔任务规划等问题。了解利用替换法证明贪心策略是否能获得全局最优解的过程。
3、熟练掌握贪心算法在两个典型图搜索中的应用,即单源最短路径和最小生成树算法中,利用合理的数据结构优化算法复杂度的技巧。

二、实验工具
Win10操作系统、python3.7编译环境、IDLE编译器

三、实验内容
设计一个贪心算法,使得对于给定的n位正整数,在删除其中任意k<=n位数字后,剩余的数字按原来的次序排列组成的新的正整数最小
输入:第一行是一个正整数A,第二行是正整数k
输出:剩余数字组成的最小数
例如输入:169584
4
输出:14

四、实验调试过程
操作对象为n位正整数,有可能超过整数的范围,存储在数组a中,数组中每一个数组元素对应整数的一位数字。
在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小。这就是所要选取的贪心策略。每次删除一个数字,选择一个使剩下的数最小的数字作为删除对象。
当k=1时,对于n位数构成的数删除哪一位,使得剩下的数据最小。删除满足如下条件的a[i]:它是第一个a[i]>a[i+1]的数,如果不存在则删除a[n]。
当k>1(当然小于n),按上述操作一个一个删除。每删除一个数字后,后面的数字向前移位。删除一个达到最小后,再从头即从串首开始,删除第2个,依此分解为k次完成。
若删除不到k个后已无左边大于右边的降序或相等,则停止删除操作,打印剩下串的左边n−k个数字即可(相当于删除了若干个最右边的数字)。
实验结果截图如下所示:
五、实验结果分析
通过本次实验,我更深一步熟悉了python的编程环境,python的基本语法,了解了贪心算法的基本思想,首先我们要知道程序体要循环n次,因为只有这样我们才能每次循环取出最小的数字;其次就是怎么取区间内的最小值。我这里用的是通过循环遍历整个区间取得最小值,最关键的是确定区间的起始位置,第一次循环的位置最好确定就是1,结束位置就是k+1,第二次循环的起始位置是第一次取出的最小值的坐标值加1,结束位置是k+2;然后继续记录最小值的坐标值,以计算下一次的起始位置。

六、实验源码

def delNum(s, k):
    n = len(s)
    if n < k: return None
    s = list(s)
    flag = 0
    while k != 0:
        if flag == 0:
            for i in range(len(s) - 1):  # 发现第一个小于后一个值的数字删除
                if s[i] > s[i + 1]:
                    del s[i]
                    k -= 1
                    flag = 1
                    break
        if flag == 1 and k != 0:  # 已经删除,但没有结束
            flag = 0
        else:  
            n = len(s)
            s = s[:n - k]
            k = 0
    return ''.join(s)
if __name__ == '__main__':
    s, k = '169584', 4
    print('剩余数字组成的最小数为:')
print(delNum(s, k))

你可能感兴趣的:(Python算法分析与设计实验:贪心算法)