第四章贪心算法实验报告

1.问题描述
 
4-2 删数问题 (30 分)
 

给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最小的删数方案。如果数字最前面有0不输出。

输入格式:

第 1 行是1 个正整数 a。第 2 行是正整数k。

输出格式:

输出最小数。

 

2.问题分析

如果要从178543中取出1个数,使这个数最小,应该取8

如果要从17543中取出1个数,使这个数最小,应该取7

如果要从1543中取出1个数,使这个数最小,应该取5
可以发现:1,7,8是一个不降序数列(有相等的升序),也就是逐渐变多,而8,5,4,3是一个不升序数列(有相等的降序),逐渐减少。

8正好是升序数列的最后一个,也是降序数列的第一个。

贪心选择性质:找到第一个升序数列的末尾并取出它就可以算成功完成了“局部的最优解”,再通过这个继续取出更多的数,直到取出k个数来

 

3.算法描述

使用一个字符数组来存储n位的正整数,用函数strlen求出数组长度,遍历数组,找到非降序末位数,用后一位覆盖那一位数(删数)

!!!注意输出最高位为0的问题

 

 

 

4.时间及空间复杂度分析

时间复杂度:代码主函数最多两层循环,循环k次,时间复杂度为O(n^2)

空间复杂度:定义了一个char数组来存储a,a共有n位,空间复杂度为O(n)

 

5.思考与体会

贪心算法首先需要得到局部最优解,再推导全局最优解。关键是找到贪心策略

(1)把求解的问题分成若干个子问题

(2)对每一子问题求解,得到子问题的局部最优解

(3)把子问题的解局部最优解合成原来解问题的一个解

 
posted @ 2021-11-11 12:18  欧丹萍  阅读(147)  评论(0编辑  收藏  举报