mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-13 14:39:44 +08:00
deploy
This commit is contained in:
@@ -3459,7 +3459,7 @@
|
||||
<p class="admonition-title">Question</p>
|
||||
<p>给定 <span class="arithmatex">\(n\)</span> 种硬币,第 <span class="arithmatex">\(i\)</span> 种硬币的面值为 <span class="arithmatex">\(coins[i - 1]\)</span> ,目标金额为 <span class="arithmatex">\(amt\)</span> ,每种硬币可以重复选取,问能够凑出目标金额的最少硬币个数。如果无法凑出目标金额则返回 <span class="arithmatex">\(-1\)</span> 。</p>
|
||||
</div>
|
||||
<p>这道题的贪心策略在生活中很常见:给定目标金额,<strong>我们贪心地选择不大于且最接近它的硬币</strong>,不断循环该步骤,直至凑出目标金额为止。</p>
|
||||
<p>本题的贪心策略如下图所示。给定目标金额,<strong>我们贪心地选择不大于且最接近它的硬币</strong>,不断循环该步骤,直至凑出目标金额为止。</p>
|
||||
<p><img alt="零钱兑换的贪心策略" src="../greedy_algorithm.assets/coin_change_greedy_strategy.png" /></p>
|
||||
<p align="center"> 图:零钱兑换的贪心策略 </p>
|
||||
|
||||
@@ -3641,7 +3641,7 @@
|
||||
</div>
|
||||
<h2 id="1511">15.1.1 贪心优点与局限性<a class="headerlink" href="#1511" title="Permanent link">¶</a></h2>
|
||||
<p><strong>贪心算法不仅操作直接、实现简单,而且通常效率也很高</strong>。在以上代码中,记硬币最小面值为 <span class="arithmatex">\(\min(coins)\)</span> ,则贪心选择最多循环 <span class="arithmatex">\(amt / \min(coins)\)</span> 次,时间复杂度为 <span class="arithmatex">\(O(amt / \min(coins))\)</span> 。这比动态规划解法的时间复杂度 <span class="arithmatex">\(O(n \times amt)\)</span> 提升了一个数量级。</p>
|
||||
<p>然而,<strong>对于某些硬币面值组合,贪心算法并不能找到最优解</strong>。我们来看几个例子:</p>
|
||||
<p>然而,<strong>对于某些硬币面值组合,贪心算法并不能找到最优解</strong>。下图给出了两个示例。</p>
|
||||
<ul>
|
||||
<li><strong>正例 <span class="arithmatex">\(coins = [1, 5, 10, 20, 50, 100]\)</span></strong>:在该硬币组合下,给定任意 <span class="arithmatex">\(amt\)</span> ,贪心算法都可以找出最优解。</li>
|
||||
<li><strong>反例 <span class="arithmatex">\(coins = [1, 20, 50]\)</span></strong>:假设 <span class="arithmatex">\(amt = 60\)</span> ,贪心算法只能找到 <span class="arithmatex">\(50 + 1 \times 10\)</span> 的兑换组合,共计 <span class="arithmatex">\(11\)</span> 枚硬币,但动态规划可以找到最优解 <span class="arithmatex">\(20 + 20 + 20\)</span> ,仅需 <span class="arithmatex">\(3\)</span> 枚硬币。</li>
|
||||
|
||||
Reference in New Issue
Block a user