2.2 贪心算法
贪心算法的精髓在于,遵循某种规则,不断地选取当前最优解。
硬币问题
假设有 1 元,5元,10元,50元,100元,500元的硬币C1,C5,C10,C50,C500枚,现在需要凑出 A 元
问如何组合才能使硬币的数量最少?
这道题给人的印象就是,为了使得硬币数目最少,尽可能使用面值大的硬币。这种策略就是计算过程中的规则。尽可能使用最大面值,就是当前最优解。
所以,使用每个硬币的数目为:
int t = min(A/Y ,Y_Max); //A为目标,Y为面值,Y_Max为面值为Y的硬币数目。
下面练习一道POJ3617:
2.2.1.BestCowLine
给定长度为N的字符串S,要构造一个长度为N的字符串T,最开始T是一个空串,随后反复进行如下操作:
1.从S的头部删除一个字符,加到T的尾部
2.从S的尾部删除一个字符,加到T的头部
目标是构建一个字典序尽可能小的字符串T。
这道题的贪心策略就是,每次都选取字符串S两头字典序较小的那个。因为规定只能从两端取,所以若两端的字典序有差别,则可以直接根据当前情况选择当前最优解。我们的需求也是,每次要选择小字典序的字母插入队列。
但是,如果字典序一样该选哪个呢?对于相同的字典序,对于当前情况是没有区别的。可是,如果一个字典序是ZB…CZÿ