Является ли расстояние между всеми аддитивными факторами или между каждым из них?Например, с 3-10-20, является ли [20-40-60] верным ответом?Я предполагаю последнее, но решение, приведенное ниже, может быть довольно тривиально изменено, чтобы работать для первого.
В любом случае, путь - начать с самого экстремального ответа (одного вида), который вы можетеуправляйте, а затем пошагово отвечайте, пока не дойдете до другого самого крайнего.
Давайте попробуем разместить как можно более низкие числа, за исключением последнего, который будет максимально высоким (учитывая, что остальныенизкие).Пусть общий делитель будет d
и разделим на него 100
, чтобы мы получили S = 100/d
.Это хорошо определяет нашу проблему.Теперь у нас есть ограничение на расстояние не более s
, за исключением того, что мы преобразуем его в число квантованных шагов n = s/d
.Теперь предположим, что у нас есть M
выборок, i1...iM
и запишите ограничения:
i1 + i2 + i3 + ... + iM = S
0 <= i1 <= n
0 <= i2 <= n
. . .
0 <= iM <= n
i1 <= i2
i2 <= i3
. . .
i(M-1) <= iM
Мы можем решить первое уравнение, чтобы получить iM
, учитывая другие.
Теперь, еслимы делаем все максимально похожим:
i1 = i2 = ... = iM = I
M*I = S
I = S/M
Очень хорошо - у нас есть отправная точка!(Если I
- это дробь, сделайте первые несколько I
, а остаток I+1
.) Теперь мы просто попытаемся пройти каждую переменную по очереди:
for (i1 = I-1 by -1 until criteria fails)
sum needs to add to S-i1
i2 >= i1
i2 <= i1 +n
solve the same problem for M-1 numbers adding to S-i1
(while obeying the above constraint on i2)
Хорошо, посмотрите здесь --У нас есть рекурсивный алгоритм!Мы просто прогуливаемся и зачитываем ответы.
Конечно, мы можем идти i1
вверх, а не вниз.Если вам нужно распечатать ответы, можете также сделать это.Если вам просто нужно их посчитать, обратите внимание, что подсчет является симметричным, поэтому просто удвойте ответ, который вы получите от обратного отсчета.(У вас также будет поправочный коэффициент, если не все значения начинаются одинаково - если некоторые были I
, а некоторые были I+1
, вам необходимо принять это во внимание, чего я не буду здесь делать.)
Редактировать: Если диапазон - это то, что должно соответствовать каждому значению, вместо всех условий
0 <= i1 <= n
, у вас есть
max(i1,i2,...,iM) - min(i1,i2,...,iM) <= n
Но это даетто же самое рекурсивное условие, за исключением того, что мы передаем максимум и минимум тех элементов, которые мы уже выбрали для добавления в микс, вместо добавления ограничения к i2
(или к тому, какой это поворот другой переменной).