今晚粗略了解一下贪心算法的意义,对我来说,平时贪心有关的题目都是常识去做的,感觉不到贪心的规律。 贪心就是最优解,我们一般面对一个量比较大的时候,不容易去枚举或者直接全局最优解,这时候就需要通过局部最优推出全局最优,也就是从小到大。如果说没有举出反例来证明局部到全局是错的,那么一般就可以用了。
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。
这是一道很经典的贪心,这里给了两个数组,分别是代表孩子胃口的g[]和代表饼干尺寸的s[]。要想最多孩子满足,我们可以从局部来想,将孩子的胃口和饼干的尺寸从小到大排序,每个孩子拿到他所拿到的满足最小尺寸,这样就可以将更大尺寸的用来满足更大胃口的孩子,从而做出最优解。
总结:一个比较常识的解决方法,先把最小和最小匹配,如果饼干尺寸不够大也就无法满足后面胃口大的孩子,所以说就直接饼干尺寸继续加大。贪心就是从小到大,从局部到全局。
贪心算法在解决优化问题时确实非常有效,但其难点在于如何正确地将问题抽象成适合贪心策略的模型。其核心思想是每一步都选择当前状态下最好或最优的选择,从而希望这样的局部最优选择能导致全局的最优解。然而,并不是所有问题都适合用贪心算法来解决,且即使适合,也需要严谨地证明其正确性。将问题抽象成贪心算法模型通常涉及以下几个步骤:
- 明确问题的当前状态以及可能的下一步状态。
- 找出每一步中应该选择什么的规则或标准。
- 根据贪心选择标准,从当前状态中选择最优的下一步。
- 根据选择更新问题的状态,并重复上述过程直到达到终止条件。
其实在做题时很容易不知道贪心算法是不是对的,虽然贪心算法在很多情况下看起来“显然”能得到最优解,但严谨的证明通常需要满足以下条件之一:
每一步的贪心选择都直接导向全局最优解;问题的最优解包含其子问题的最优解。
证明这些性质往往涉及复杂的数学推导和逻辑推理。在实际应用中,当证明过程过于复杂或不可行时,通常会通过一个非常简单的验证贪心算法是不是对的:举个反‘栗’