mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-19 23:10:58 +00:00
deploy
This commit is contained in:
@@ -3698,7 +3698,7 @@
|
||||
<p>例如零钱兑换问题,我们虽然能够容易地举出反例,对贪心选择性质进行证伪,但证实的难度较大。如果问:<strong>满足什么条件的硬币组合可以使用贪心算法求解</strong>?我们往往只能凭借直觉或举例子来给出一个模棱两可的答案,而难以给出严谨的数学证明。</p>
|
||||
<div class="admonition quote">
|
||||
<p class="admonition-title">Quote</p>
|
||||
<p>有一篇论文专门讨论了该问题。作者给出了一个 <span class="arithmatex">\(O(n^3)\)</span> 时间复杂度的算法,用于判断一个硬币组合是否可以使用贪心算法找出任何金额的最优解。</p>
|
||||
<p>有一篇论文给出了一个 <span class="arithmatex">\(O(n^3)\)</span> 时间复杂度的算法,用于判断一个硬币组合是否可以使用贪心算法找出任何金额的最优解。</p>
|
||||
<p>Pearson, David. A polynomial-time algorithm for the change-making problem. Operations Research Letters 33.3 (2005): 231-234.</p>
|
||||
</div>
|
||||
<h2 id="1513">15.1.3 贪心解题步骤<a class="headerlink" href="#1513" title="Permanent link">¶</a></h2>
|
||||
@@ -3717,14 +3717,14 @@
|
||||
<p>然而,正确性证明也很可能不是一件易事。如若没有头绪,我们通常会选择面向测试用例进行 Debug ,一步步修改与验证贪心策略。</p>
|
||||
<h2 id="1514">15.1.4 贪心典型例题<a class="headerlink" href="#1514" title="Permanent link">¶</a></h2>
|
||||
<p>贪心算法常常应用在满足贪心选择性质和最优子结构的优化问题中,以下列举了一些典型的贪心算法问题。</p>
|
||||
<ol>
|
||||
<ul>
|
||||
<li><strong>硬币找零问题</strong>:在某些硬币组合下,贪心算法总是可以得到最优解。</li>
|
||||
<li><strong>区间调度问题</strong>:假设你有一些任务,每个任务在一段时间内进行,你的目标是完成尽可能多的任务。如果每次都选择结束时间最早的任务,那么贪心算法就可以得到最优解。</li>
|
||||
<li><strong>分数背包问题</strong>:给定一组物品和一个载重量,你的目标是选择一组物品,使得总重量不超过载重量,且总价值最大。如果每次都选择性价比最高(价值 / 重量)的物品,那么贪心算法在一些情况下可以得到最优解。</li>
|
||||
<li><strong>股票买卖问题</strong>:给定一组股票的历史价格,你可以进行多次买卖,但如果你已经持有股票,那么在卖出之前不能再买,目标是获取最大利润。</li>
|
||||
<li><strong>霍夫曼编码</strong>:霍夫曼编码是一种用于无损数据压缩的贪心算法。通过构建霍夫曼树,每次选择出现频率最小的两个节点合并,最后得到的霍夫曼树的带权路径长度(即编码长度)最小。</li>
|
||||
<li><strong>Dijkstra 算法</strong>:它是一种解决给定源顶点到其余各顶点的最短路径问题的贪心算法。</li>
|
||||
</ol>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3705,8 +3705,8 @@ n = 3 a + b
|
||||
<h3 id="3">3. 正确性证明<a class="headerlink" href="#3" title="Permanent link">¶</a></h3>
|
||||
<p>使用反证法,只分析 <span class="arithmatex">\(n \geq 3\)</span> 的情况。</p>
|
||||
<ol>
|
||||
<li><strong>所有因子 <span class="arithmatex">\(\leq 3\)</span></strong> :假设最优切分方案中存在 <span class="arithmatex">\(\geq 4\)</span> 的因子 <span class="arithmatex">\(x\)</span> ,那么一定可以将其继续划分为 <span class="arithmatex">\(2(x-2)\)</span> ,从而获得更大的乘积。这与假设矛盾。</li>
|
||||
<li><strong>切分方案不包含 <span class="arithmatex">\(1\)</span></strong> :假设最优切分方案中存在一个因子 <span class="arithmatex">\(1\)</span> ,那么它一定可以合并入另外一个因子中,以获取更大乘积。这与假设矛盾。</li>
|
||||
<li><strong>所有因子 <span class="arithmatex">\(\leq 3\)</span></strong> :假设最优切分方案中存在 <span class="arithmatex">\(\geq 4\)</span> 的因子 <span class="arithmatex">\(x\)</span> ,那么一定可以将其继续划分为 <span class="arithmatex">\(2(x-2)\)</span> ,从而获得更大的乘积。这与假设矛盾。</li>
|
||||
<li><strong>切分方案不包含 <span class="arithmatex">\(1\)</span></strong> :假设最优切分方案中存在一个因子 <span class="arithmatex">\(1\)</span> ,那么它一定可以合并入另外一个因子中,以获取更大乘积。这与假设矛盾。</li>
|
||||
<li><strong>切分方案最多包含两个 <span class="arithmatex">\(2\)</span></strong> :假设最优切分方案中包含三个 <span class="arithmatex">\(2\)</span> ,那么一定可以替换为两个 <span class="arithmatex">\(3\)</span> ,乘积更大。这与假设矛盾。</li>
|
||||
</ol>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user