This commit is contained in:
krahets
2026-04-14 18:06:19 +08:00
parent 17b2a0b630
commit cf0747ba3e
131 changed files with 604 additions and 609 deletions
@@ -4708,7 +4708,7 @@
<p>У вас может невольно вырваться: «Эврика!» Жадный алгоритм решает задачу размена монет всего примерно десятью строками кода.</p>
<h2 id="1511">15.1.1 &nbsp; Преимущества и ограничения жадного алгоритма<a class="headerlink" href="#1511" title="Permanent link">&para;</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>. На рисунке 15-2 показаны два примера.</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>