Моя домашняя работа включают в себя динамическое программирование вопрос:Алгоритмы - Динамическое программирование - Подмножество сумма двух массивов
Учитывая два массива натуральных чисел (a1, a2, ..., ап и b1, b2, .. ., bn) , все они меньше n^2, а также задано число B , которое меньше n^3.
Вам нужно, если есть отсрочка массив (c1, c2, ..., сп) такие:
И для каждого 1 = < < я = п, CI = ая или ci = bi.
* Этот алгоритм должен быть написан с динамическим программированием.
* Кроме того, что нам нужно было бы изменить, чтобы Acctually получить C массива, который дает нам Sum (с) = B
Другой способ смотреть на вопрос, говоря, что с равна подмножество a и его подмножество дополнения из b.
Это рекурсивный псевдокод я написал, чтобы решить этот вопрос:
W(a,b,i, N)
if i==-1
if N==0 return true;
else return false;
return W(a,b,i-1,N-a[i]) || W(a,b,i-1,N-b[i]);
T(n) = 2^n
И вот, чтобы вернуть лучший путь, просто хранить это в дереве, и перейти от (хорошего) конца начало
Как это записать с помощью динамического программирования? Это поможет даже время выполнения? потому что рекурсивное решение имеет независимые результаты.
* Я искал google для этой проблемы и не нашел ничего, кроме «проблемы с подмножеством сумм», которая отличается.
Хм, я думаю, вы очень близки к решению динамического программирования. Просто нужно добавить таблицу 'dp' в рекурсивный метод, и все готово. Что касается временной сложности, то в этом случае он будет равен размеру вашей таблицы 'dp'. –
Я не понимаю (логично), как здесь может помочь представление таблицы. У нас есть 2^n вызовов, которые я лучше представляю как дерево. Как это будет работать? – Amit
Это нормальная подмножество в очень тонкой маскировке. Рассмотрим новый массив 'd [i] = a [i] - b [i]' и новое число 'g = n - sum (b)'.Решите подмножество-sum (d, g), и у вас есть решение для вашей исходной проблемы. –