Динамическое программирование: задача о рюкзаке

от автора

в

Что такое динамическое программирование?

Динамическое программирование (DP) — метод решения задач, которые можно разбить на перекрывающиеся подзадачи. Решения подзадач кэшируются, чтобы не пересчитывать их повторно.

Пример кода на C++

#include <iostream>
#include <vector>
#include <algorithm>

int knapsack(int W, const std::vector<int>& weights, const std::vector<int>& values, int n) {
    std::vector<std::vector<int>> dp(n + 1, std::vector<int>(W + 1, 0));

    for (int i = 1; i <= n; i++) {
        for (int w = 0; w <= W; w++) {
            if (weights[i - 1] <= w)
                dp[i][w] = std::max(dp[i - 1][w],
                    dp[i - 1][w - weights[i - 1]] + values[i - 1]);
            else
                dp[i][w] = dp[i - 1][w];
        }
    }
    return dp[n][W];
}

Сложность

  • Время: O(n × W)
  • Память: O(n × W)

Когда использовать?

DP идеально подходит для задач оптимизации, где нужно найти максимальное или минимальное значение при определённых ограничениях.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *