2015-02-16 3 views
4

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

Вход: массив из п целых чисел и число к

Мы должны найти набор чисел из массива, что произведение всех этих чисел в наборе равна K является

Я думаю, Я должен использовать динамическое программирование для этой задачи. Но я понятия не имею, как его использовать.

+0

Похоже [подмножество проблемы суммы] (http://en.wikipedia.org/wiki/Subset_sum_problem), только с другим оператором , –

ответ

5

Это похоже на проблему суммы подмножества, в которой вам необходимо найти подмножество, сумма которого равна k.

Поскольку есть решение вашей проблемы (у вас есть подмножество S которых умножение k) тогда и только тогда, когда у вас есть подмножество лога (х) для каждого х в наборе, которых сумма log(k) (то же самое подмножество, с log на каждый элемент), проблемы в значительной степени идентичны.

Однако решение DP, которое обычно используется, очень эффективно для сумм, поскольку сумма элементов не имеет тенденций в конечном итоге огромную, а умножение -. Вы также не можете принимать log по всем элементам и «работать с ним», потому что числа не будут целыми числами, а для решения DP для подмножества суммы требуются целые числа.

Однако вы можете частично решить эту проблему, используя Top-Down DP (memoization). Это довольно просто и делается следующим образом:

existenceOfSubset(set, sum, map): 
    if (sum == 1): 
      return true 
    if (set.isEmpty()): 
      return false 
    if (map.containsKey(sum)): 
      return map.get(sum) 
    first = set.getFirst() 
    set= set.removeFirst() 
    sol = existenceOfSubset(set,sum,map) OR (sum%first == 0?existenceOfSubset(set,sum/first,map):false) //recursive step for two possibilities 
    map.put(sum,sol) //memorize 
    set.addFirst(first) //clean up 
    return sol 

вызова с existenceOfSubset(set,sum,new HashMap())

+0

Это ** memoization **, без r. – IVlad

+0

@IVlad Спасибо, не знал этого. – amit

+0

С верхним DP, нужны ли нам журналы? Не может ли наш рекурсивный шаг не делить этот элемент и делиться, если это возможно? (у вас все еще есть раздел в вашем коде, на самом деле я этого не понимаю). – IVlad

Смежные вопросы