Как можно решить задачу о рюкзаке на 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),что приемлемо для заданных ограничений.