Классическим примером использования динамического программирования является задача о рюкзаке. Давайте разберем, что это за задача и как мы можем её решить с помощью динамического программирования.
Задача о рюкзаке формулируется следующим образом:
- У нас есть рюкзак, который может выдержать определенный вес (максимальная емкость).
- Есть набор предметов, каждый из которых имеет определенный вес и стоимость.
- Наша цель — выбрать предметы таким образом, чтобы максимизировать общую стоимость предметов, не превышая при этом вес рюкзака.
Теперь давайте рассмотрим шаги, которые необходимо выполнить для решения этой задачи с использованием динамического программирования:
- Определение параметров:
- Пусть n — количество предметов.
- Пусть W — максимальный вес, который может выдержать рюкзак.
- Пусть weights[i] — вес i-го предмета.
- Пусть values[i] — стоимость i-го предмета.
- Создание таблицы:
- Создадим двумерный массив dp размером (n+1) x (W+1), где dp[i][w] будет представлять максимальную стоимость, которую можно получить, используя первые i предметов и вес не более w.
- Инициализация:
- Заполним первую строку и первый столбец нулями, так как если нет предметов или вес рюкзака равен нулю, то стоимость будет равна нулю.
- Заполнение таблицы:
- Пройдем по всем предметам (i от 1 до n) и по всем возможным весам (w от 0 до W).
- Если вес i-го предмета больше w, то мы не можем его взять, и поэтому dp[i][w] = dp[i-1][w].
- Если вес i-го предмета меньше или равен w, то мы можем выбрать: либо взять этот предмет, либо не брать его. Поэтому:
- dp[i][w] = max(dp[i-1][w], values[i-1] + dp[i-1][w - weights[i-1]]).
- Результат:
- После заполнения таблицы, максимальная стоимость будет находиться в dp[n][W].
Таким образом, задача о рюкзаке является классическим примером применения динамического программирования, позволяя эффективно находить оптимальные решения для задач с ограничениями.