РУҚА
27

Решение: Максимальная сумма без делимости

ЕГЭ · Информатика · Задание 27 · Динамическое программирование
ВысокаяФИПИ549B82Короткий ответ≈ 15 минутРазбор в 4 шага
Условие

Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на $k = 109$ и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно.

Даны два входных файла — файл A и файл B. Каждый файл содержит в первой строке количество троек $N$ ($1 \leq N \leq 1\,000\,000$). Каждая из следующих $N$ строк содержит три натуральных числа, не превышающих $12\,000$.

Для приведённого в условии примера, если $k = 5$, искомая сумма равна 44. В ответе укажите значение искомой суммы для файла A, затем для файла B. Для обработки файла B нельзя использовать перебор всех возможных вариантов.

Вложенные файлы с исходными данными в предоставленном наборе отсутствуют, поэтому числовые значения ответов для файлов A и B определить невозможно.

Открыть задачу и решить самому
Дальше ответЕсли ещё решаете — начните с подсказок: они ведут к ответу, но не выдают его.
К подсказкам

Решение по шагам

4 шага
1

Состояние динамического программирования определяется остатком текущей суммы при делении на $109$. Для каждого остатка сохраняется наибольшая возможная сумма.

$$dp[r] = \text{максимальная сумма с остатком } r$$
2

При обработке очередной тройки перебираем только три варианта выбора. Для каждого прежнего остатка $r$ и числа $x$ из тройки обновляем состояние с новым остатком.

$$new[(r+x) \bmod 109] = \max(new[(r+x) \bmod 109],\, dp[r]+x)$$
3

После обработки всех троек запрещён остаток $0$. Поэтому ответом является максимум среди состояний с остатками от $1$ до $108.

$$\max\{dp[r]\mid 1 \leq r < 109\}$$

Численные ответы для файлов A и B нельзя вычислить без самих файлов с исходными данными.

Ответ

Численные значения ответов для файлов A и B не определяются без приложенных входных файлов.

Этот ответ получен в разборе, но не сверен с официальным ключом из банка — проверьте выкладки, прежде чем заучивать результат.

Где здесь ошибаются

Хранить только одну максимальную сумму и потерять информацию об остатке.

Разрешить выбирать несколько чисел из одной тройки или не выбирать ни одного.

Включить сумму с остатком 0 в итоговый максимум.

Использовать перебор всех вариантов, имеющий экспоненциальную сложность.

Закрепить приёмВ теме «Динамическое программирование» ещё 71 задача — с ответом и таким же разбором.
Тренироваться

Как решать задание 27 ЕГЭ, информатика

Разбор этой задачи разложен на 4 шага: видно, откуда берётся каждое число и где теряется балл. Ответ приведён рядом с выкладками, а не вместо них.

Задача из темы «Динамическое программирование»: в ней 72 задачи, и у каждой есть такой же разбор. Регистрация не нужна.