Найдите максимальную сумму подмножества, кратную D, взяв не более K элементов из заданного массива.
Учитывая массив A[] размера N и два числа K и D , задача состоит в том, чтобы вычислить максимальную сумму подмножества, кратную D , возможную, взяв не более K элементов из A .
Примеры:
Input: A={11, 5, 5, 1, 18}, N=5, K=3, D=7
Output:
28
Explanation:
The subset {5, 5, 18} gives the maximum sum=(5+5+18)=28 that is divisible by 7 and also has contains atmost 3 elementsInput: A={7, 7, 7, 7, 7}, N=5, K=2, D=7
Output:
14
Наивный подход: Наивный подход заключался бы в создании всех подмножеств A (с использованием битовой маскировки) и для каждого подмножества, вычислении суммы и проверке того, не превышает ли длина подмножества K , а сумма делится на D , и вычисление максимального среди них.
Ниже приведена реализация вышеуказанного подхода:
Временная сложность: O(N.2 N )
Вспомогательное пространство: O(1)
Эффективный подход: эта проблема может быть решена с помощью динамического программирования с помощью трехмерного массива dp, где dp[i][j][p] хранит максимально возможную сумму, если элементы j взяты до i -го индекса и его модуля D р . Следуйте инструкциям, чтобы решить проблему:
- Создайте трехмерный массив dp[][][] размера ( N+1)x(K+1)x(D) и инициализируйте его значением -1.
- Итерируйте от 1 до N и для каждого текущего индекса i сделайте следующее:
- Инициализировать элемент с двумя переменными и изменить их на A[i-1] и A[i-1]%D .
- Скопируйте dp[i-1] в dp[i].
- Итерируйте от 1 до K и для каждого текущего индекса j сделайте следующее:
- Обновите dp[i][j][mod] как максимум из dp[i][j][mod] и элемента.
- Итерируйте от 0 до D-1 и для каждого текущего индекса p сделайте следующее:
- Если dp[i-1][j-1][p] не равно -1, обновите dp[i][j][(p+mod)%D] как максимальное значение dp[i][j] [(p+mod)%D] и dp[i-1][j-1][p]+элемент.
- Если dp[N][K][0] равно -1, ответ равен 0.
- В противном случае ответ будет dp[N][K][0].
Ниже приведена реализация вышеуказанного подхода:
Временная сложность: O(NKD)
Вспомогательное пространство: O(NKD)