实际生活中,经常需要求一些问题的“可行解”和“最优解”,这就是所谓的“最优化”问题。 一般来说,每个最优化问题都包含一组“限制条件”和一个“目标函数”,符合限制条件的问题求解方案称为可行解,使目标函数取得最佳值(最大或最小)的可行解称为最优解。 求解最优化问题的算法很多,例如穷举、搜索、动态规划等。贪心法也是求解这类问题的一种常用方法
1. 贪心法的基本思想
贪心法是从问题的某个初始解出发,采用逐步构造最优解的方法,向给定的目标前进。在每一个局部阶段,都做一个“看上去”最优的决策,并期望通过每一次所做的局部最优选择产生出一个全局最优解。做出贪心决策的依据称为“贪心策略”。要注意的是,贪心策略一旦做出,就不可再更改。 与递推不同的是,贪心严格意义上说只是一种策略或方法,而不是算法。推进的每一步不是依据某一个固定的递推式,而是做一个当时“看似最佳”的贪心选择(操作),不断将问题归纳为更小的相似子问题。所以,归纳、分析、选择正确合适的贪心策略,是解决贪心问题的关键。
例:删数
【问题描述】 输入一个高精度的正整数 n(长度小于或等于 240 位),去掉其中任意 s 个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的 n 和 s,寻找一种方案,使得剩下的数字组成的新数最小。
【输入格式】 输入两行,第 1 行为 1 个正整数 n,第 2 行为 1 个整数 s。
【输出格式】 输出一行一个数,表示最后剩下的最小数。
【输入样例】 178543 4
【输出样例】 13
【问题分析】 为了尽可能逼近目标,选取的贪心策略为:每一步总是选择一个使剩下的数最小的数字删去,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则,删除第一个递减区间的首字符,这样删一位便形成了一个新数字串。然后回到数字串首,按上述规则再删下一个数字。重复以上过程 s 次为止,剩下的数字串便是问题的解。
2. 贪心法的正确性证明
对于一个问题,如果想用贪心法求解,首先要想到基于某种“序”或者“规则”的贪心策略。 其次还要能证明其正确性。要严格证明一个贪心算法的正确性是很困难的,目前最有效的一种