Как можно решить задачу о рюкзаке на C++, используя динамическое программирование, и написать весь код только в функции int main()? Дано N предметов с массами m1, …, mN и стоимостью c1, …, cN, которые нужно разместить в рюкзаке, выдерживающем вес не более M. Как найти наибольшую стоимость предметов в рюкзаке? Входные данные включают натуральное число N (не более 100) и M (не более 10000), затем N натуральных чисел mi (не более 100) и N натуральных чисел ci (не более 100). Выходные данные должен показывать наибольшую стоимость рюкзака.
Информатика 11 класс Динамическое программирование задача о рюкзаке динамическое программирование C++ код функции main максимальная стоимость рюкзак N предметов веса и стоимости алгоритм программирование Новый
Задача о рюкзаке является классическим примером использования динамического программирования. В данной задаче мы будем решать задачу о 0/1 рюкзаке, где каждый предмет можно взять только один раз. Давайте разберем, как это сделать на C++ в функции int main().
Для решения этой задачи мы будем использовать массив dp, где dp[j] будет хранить максимальную стоимость, которую можно получить с рюкзаком, имеющим вместимость j.
Вот шаги, которые мы будем выполнять:
Теперь давайте посмотрим на код:
#include <iostream> #include <vector> int main() { int N, M; std::cin >> N >> M; std::vectorm(N), c(N); for (int i = 0; i < N; ++i) { std::cin >> m[i]; } for (int i = 0; i < N; ++i) { std::cin >> c[i]; } std::vector dp(M + 1, 0); for (int i = 0; i < N; ++i) { for (int j = M; j >= m[i]; --j) { dp[j] = std::max(dp[j], dp[j - m[i]] + c[i]); } } std::cout << dp[M] << std::endl; return 0; }
В этом коде:
Таким образом, мы решаем задачу о рюкзаке с использованием динамического программирования. Этот подход позволяет эффективно находить решение за время O(N * M), что приемлемо для заданных ограничений.