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
@@ -4396,7 +4396,7 @@
<p align="center"> Рисунок 15-4 &nbsp; Ценность предмета на единицу веса </p>
<h3 id="1">1. &nbsp; Определение жадной стратегии<a class="headerlink" href="#1" title="Permanent link">&para;</a></h3>
<p>Максимизация общей ценности предметов в рюкзаке <strong>по сути равносильна максимизации ценности на единицу веса</strong>. Отсюда естественно выводится следующая жадная стратегия.</p>
<p>Максимизация общей ценности предметов в рюкзаке <strong>по сути равносильна максимизации ценности на единицу веса</strong>. Отсюда естественно выводится жадная стратегия, показанная на рисунке 15-5.</p>
<ol>
<li>Отсортировать предметы по убыванию удельной ценности.</li>
<li>Перебирать все предметы и <strong>на каждом шаге жадно выбирать предмет с наибольшей удельной ценностью</strong>.</li>
@@ -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>
@@ -4409,7 +4409,7 @@ cap[i, j] = \min(ht[i], ht[j]) \times (j - i)
<p align="center"> Рисунок 15-10 &nbsp; Состояние после перемещения короткой перегородки внутрь </p>
<p>Отсюда и выводится жадная стратегия для этой задачи: инициализировать два указателя по краям контейнера и на каждом шаге сдвигать внутрь указатель, соответствующий короткой перегородке, пока указатели не встретятся.</p>
<p>На рисунках ниже показан процесс выполнения этой жадной стратегии.</p>
<p>На рисунке 15-11 показан процесс выполнения этой жадной стратегии.</p>
<ol>
<li>В начальном состоянии указатели <span class="arithmatex">\(i\)</span> и <span class="arithmatex">\(j\)</span> стоят на двух концах массива.</li>
<li>Вычислить вместимость текущего состояния <span class="arithmatex">\(cap[i, j]\)</span> и обновить максимальную вместимость.</li>