Динамическое программированиеKnapsackМатрицыМемоизация
1 мин чтение
Динамическое программирование: Мемоизация, 0-1 Рюкзак и Перемножение матриц
Полный разбор ДП: перекрывающиеся подзадачи, оптимальная подструктура, Top-Down vs Bottom-Up, задача о рюкзаке (0-1 Knapsack) и задача о расстановке скобок при перемножении цепочки матриц (Matrix Chain Multiplication).
Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.
Фундамент динамического программирования
ДП применяется, когда задача обладает:
1. Дискретная задача о 0-1 рюкзаке
Даны предметов с весами и стоимостями . Вместимость .
cpp
int knapsack(int W, const vector<int>& wt, const vector<int>& val) {
int n = wt.size();
vector<int> dp(W + 1, 0);
for (int i = 0; i < n; ++i) {
for (int w = W; w >= wt[i]; --w) {
dp[w] = max(dp[w], dp[w - wt[i]] + val[i]);
}
}
return dp[W];
}
2. Перемножение цепочки матриц (Matrix Chain Multiplication)
Дана цепочка матриц , где имеет размер . Найти порядок расстановки скобок с минимальным числом скалярных умножений.
Сложность: времени и памяти.
Что дальше?
Закрепите материал задачей: Повторить число.
Изучено — к практике →Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».