9.5.  Демонстрация. Задача о рюкзаке

Шаг 1

Конечно, эту задачу легче всего решить динамическим программированием! Для этого мы будем продвигаться по всему массиву следующим образом. Сначала посмотрим на камни, до которых мы можем допрыгнуть. Выберем среди них один с самой большой цифрой и прыгнем на него. Это самое оптимальное локальное решение: ведь чем больше число, тем дальше оно сможет нас унести!

import {test} from "./tester";


function countJumps(pebbles) {
  return 0;
}

test(countJumps([2,3,1,1,4]), 2);

Шаг 2

Жадные алгоритмы невероятно простые, поэтому и наша демонстрация получилась в формате «возьмите и сделайте это». Однако не все задачи можно решить при помощи жадности! Об этом поговорим в следующей статье.


import {test} from "./tester";


function countJumps(pebbles) {
  let jumps = 0;

  let previousPosition = 0; // Позиция предыдущего оптимального прыжка
  let currentPosition = 0; // Позиция текущего прыжка

  // Пока не допрыгали до конца...
  while (currentPosition < pebbles.length - 1) {
    // Прыгаем!
    jumps++;

    // Нам нужно обойти все камни, которые мы можем достигнуть с предыдущего до текущего прыжка
    // Но так как дальше мы будем менять previousPosition, я заранее сохраняю его
    let candidate = previousPosition;

    // Текущий прыжок становится предыдущим
    previousPosition = currentPosition;

    while (candidate <= previousPosition) {
      // А текущий прыжок — это максимально достижимый камень с предыдущей
      currentPosition = Math.max(currentPosition, candidate + pebbles[candidate]);
      candidate++;
    }
  }

  return jumps;
}

test(countJumps([2,3,1,1,4]), 2);

File tester.js

const results = document.getElementById('results')

export function test(left, right) {
  const result = document.createElement('li');

  if (left === right) {
    result.innerHTML = "Тест пройден!";
    result.style.color = "green";
  } else {
    result.innerHTML = `Тест не пройден! ${left} не равно ${right}`;
    result.style.color = "red";
  }

  results.appendChild(result);
}