Существует ли эффективный алгоритм для нахождения всех последовательностей k неотрицательных целых чисел, которые составляют n , при этом избегая вращений (полностью, если это возможно)? Порядок имеет значение, но ротации излишни для проблемы, над которой я работаю.
Например, с k = 3 и n = 3 я бы хотел получить список, подобный следующему:
(3, 0, 0), (2, 1, 0), (2, 0, 1), (1, 1, 1).
Кортеж (0, 3, 0) не должен быть в списке, так как это ротация (3, 0, 0). Однако (0, 3, 0) может быть в списке вместо (3, 0, 0). Обратите внимание, что оба (2, 1, 0) и (2, 0, 1) находятся в списке - Я не хочу избегать всех перестановок кортежа, просто вращения . Кроме того, 0 является допустимой записью - я не ищу разделы n .
Моя текущая процедура состоит в том, чтобы выполнить цикл из более чем 1 <= <em>i <= <em>n , установить первую запись равной i , а затем рекурсивно решить проблема для n ' = n - i и k' = k - 1. Я получаю некоторую скорость -приняв обязательство, чтобы ни одна запись не была строго больше, чем первая, но этот подход все еще генерирует много вращений - например, учитывая n = 4 и k = 3, оба (2,2,0) и (2,0,2) находятся в списке вывода.
Редактировать: Добавлены пояснения жирным шрифтом. Я прошу прощения за то, что не сделал эти вопросы такими ясными, как следовало бы в оригинальном сообщении.