Я думаю, что дерево - лучший способ думать об этом, но вы можете использовать рекурсию, чтобы построить его без явного создания дерева. Вы можете думать о корне как о вашем общем количестве. Используя группы размером 3-7, вам нужно найти некоторую комбинацию групп, которая суммирует вашу общую сумму.
Вы можете использовать 0 групп по 7, 1 группу по 7, 2 группы по 7 и т. Д. Для каждого из этих значений вы можете использовать 0 групп по 6, 1 группу по 6 и т. Д. Первый уровень вашего дерева будет представлять, сколько было использовано 7. Второй уровень - это количество использованных 6 и т. Д. Когда вы используете x 7, вам необходимо выяснить, сколько комбинаций 6, 5, 4 и 3 можно использовать для суммирования до (sum-x * 7). и т. д. для каждого нижнего уровня (рекурсивный вызов).
Ваше дерево всегда будет иметь 5 уровней.
Использование рекурсии для построения дерева, вот небольшой пример кода Python (без попытки обрезки дерева, он исследует всю вещь).
MIN = 3
MAX = 7
def findComb(remaining, start, path):
times = remaining/start
if start == MIN:
if remaining % MIN == 0:
print "%s, %d %d's" % (path[1:], times, start)
return
for i in range(0, times+1):
findComb(remaining- (i*start), start-1, "%s, %d %d's" % (path, i, start))
findComb(12, MAX, "")
Это выводит:
0 7's, 0 6's, 0 5's, 0 4's, 4 3's
0 7's, 0 6's, 0 5's, 3 4's, 0 3's
0 7's, 0 6's, 1 5's, 1 4's, 1 3's
0 7's, 1 6's, 0 5's, 0 4's, 2 3's
0 7's, 2 6's, 0 5's, 0 4's, 0 3's
1 7's, 0 6's, 1 5's, 0 4's, 0 3's