Это решение динамического программирования для этой проблемы, и я кодировал его для Emercoin в пределах оптимизатор транзакций .
Идея алгоритма: Вы создаете массив из элемента [k + 1].Индексом в этом массиве является сумма, которой может быть достигнуто некоторое входное значение, а значением в массиве - номер ввода, используемый для достижения этой суммы.Значение -1 показывает, что эта сумма не может быть достигнута текущим подмножеством элементов.
Давайте посмотрим на ваш пример.В вашем примере k = 13, и мы изначально создаем массив DP из 14 из -1:
DP = (-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
пустой выходной набор (сумма = 0) может быть достигнут любым способом, и из-за этого мы помещаем в DP [0] некоторое не минус_1, например - 0в результате DP [0] == 0:
DP = (0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
После этого для всех входных значений из вашего массива A [i] выполните следующее:
- итерируйте массив DP в обратном направлении
- , если DP [j]> = 0&& DP [j + A [i]] <0, тогда DP [j + A [i]] = i; </li>
Есть идея: если сумма «j» была достигнута на каком-то предыдущем шаге,и у нас есть значение A [i], тогда можно получить сумму «j + A [i]», добавив i-й элемент из массива A.
В нашем примере после добавления вашего A [0] == 4, у нас будет DP:
DP = (0 -1 -1 -1 0 -1 -1 -1 -1 -1 -1 -1 -1 -1)
Этот ноль означает: сумма «4» может быть достигнута с помощью A [0].
Попытка добавить A [1] = 15. Существует два возможных местоположенияn для i = 1, DP [19] и dp [15].Оба выходят за пределы массива, поэтому мы просто не обновляем массив DP.
Попытка добавить A [2] = 7. Существует два возможных местоположения для i = 2, DP [11] и dp [7].После обновления массив DP будет:
DP = (0 -1 -1 -1 0 -1 -1 2 -1 -1 -1 2 -1 -1)
Пропустить A[3] == 21, так же, как A [1].
Попытка добавить A [4] = 2. Массив DP будет:
DP = (0 -1 4-1 0 -1 4 2 -1 4 -1 2 -1 4)
Входной массив A [] выхлоп, массив DP готов к интерпретации.Видим, DP [13]> = 0, поэтому сумма 13 достигнута.DP [13] == 4, поэтому сумма "13" достигается A [4].Помни это.Рассмотрим массив DP как связанный список, где значение относится к предыдущей позиции.Итак, prev = 13-2 = 11. Видим, A [2] также входит в сумму.помните "2".Предыдущая позиция: prev = 11-7 = 4. См. DP [4].есть "0".помните [0] тоже.Prev = 4-4 = 0. Мы достигли DP [0], остановите интерпретацию.Таким образом, мы собрали запомненные индексы в A [4,2,0].
Проблема решена.