Блог пользователя someth

Автор someth, история, 8 лет назад, По-русски

Здравствуйте, попалась задача на динамику:
Нужно найти подмножество чисел A1, A2 .... An чтобы их произведение, взятое по модулю m, было максимально. И еще нужно уметь восстанавливать ответ. Подскажите идею динамики.
m < 10000
0 <= Ai <= 10000
n <= 100

Буду благодарен за помощь!

  • Проголосовать: нравится
  • -2
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Коль ограничения на n и m невелики достаточно знать до каких чисел по модулю m можно добраться. То есть для каждого Ai переберём все числа по модулю m, до которых уже добрались, и обновим это множество. Для восстановления ответа необходимо хранить еще число, с помощью которого получилось прийти в текущее состояние. O(n*m).

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Можно на примере пожалуйста?

    • »
      »
      »
      8 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +24 Проголосовать: не нравится

      Допустим, m = 7, n = 3, A = [4, 2, 5].

      Условимся, что произведение пустого множества — единица. Изначально доступно лишь одно состояние динамики: dp[1] = true.

      Перебираем массив А.

      Для первого элемента: 1 * 4 % 7 = 4, значит dp[4] = true.

      Для второго элемента: 1 * 2 % 7 = 2, 4 * 2 % 7 = 1, значит dp[2] = true, а dp[1] и так было true до этого.

      Для третьего элемента: 1 * 5 % 7 = 5, 2 * 5 % 7 = 3, 4 * 5 % 7 = 6, значит dp[5] = true, dp[3] = true, dp[6] = true.

      Максимальным произведением по модулю m получилось 6.

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

      Для описанного теста это будет выглядеть так (с помощью какого числа пришли/откуда пришли):

      dp[1] = { -, - } dp[2] = { 2, 1 } dp[3] = { 5, 2 }

      dp[4] = { 4, 1 } dp[5] = { 5, 1 } dp[6] = { 5, 4 }

      Определив максимальное достаточно лишь пройтись в обратную сторону по состояниям динамики до единицы.

      То есть для описанного теста: 6 -> 4 -> 1, а сам ответ: 5 * 4.

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Простите за ошибку. Ограничения я поменял.

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Это ничего, потому что описанное решение работает за O(n*m).

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

С задачей о рюкзаке вы знакомы?