LINUX.ORG.RU

Подскажите алгоритм по которому можно перебрать все следующие комбинации

 


0

2

Я подзабыл комбинаторику и мне требуется намек в каком направлении копать

	tokens_qty == 1
	+---+
	| 0 | i = 1
	+---+

	tokens_qty == 2
	+-------+
	| 0   0 | i = 1
	+---+---+
	| 0 | 0 | i = 2
	+---+---+

	tokens_qty == 3
	+-----------+
	| 0   0   0 | i = 1
	+-------+---+
	| 0   0 | 0 | i = 2
	+---+---+---+
	| 0 | 0   0 | i = 2
	+---+---+---+
	| 0 | 0 | 0 | i = 3
	+---+---+---+

	tokens_qty == 4
	+---------------+
	| 0   0   0   0 | i = 1
	+-----------+---+
	| 0   0   0 | 0 | i = 2
	+-------+---+---+
	| 0   0 | 0   0 | i = 2
	+---+---+-------+
	| 0 | 0   0   0 | i = 2
	+---+---+---+---+
	| 0   0 | 0 | 0 | i = 3
	+---+---+---+---+
	| 0 | 0   0 | 0 | i = 3
	+---+---+---+---+
	| 0 | 0 | 0   0 | i = 3
	+---+---+---+---+
	| 0 | 0 | 0 | 0 | i = 4
	+---+---+---+---+
★★★★★

Если порядок не важен, то просто рассматриваешь битовое представление чисел 0..2^(tokens_qty-1)

mix_mix ★★★★★
()
Последнее исправление: mix_mix (всего исправлений: 1)

Судя по примеру, требуются все комбинации вкл/выкл для n-1 разграничителей.

Алгоритм называется «перебор подмножеств» и, как верно заметил предыдущий комментатор, на небольших n его проще всего реализовать путём перебора чисел от 0 до 2^n - 1.

Если бы порядок в разбиении не был важен, то количество возможных результатов являлось бы интересной функцией под названием partition function, p(n). Для перебора разбиений известен несложный комбинаторный алгоритм.

ringill
()
Ответ на: комментарий от ringill

Судя по примеру, требуются все комбинации вкл/выкл для n-1 разграничителей.

Именно так.

cvv ★★★★★
() автор топика

pod is positions of delimeters :)

seq is 0,1,2,3,4,n

pos on right so last delim after n. so pos in [0..n] to

gen_all_pods(n):
        gen(0,n,[])

gen(l,r,o):
        if l>r:
                out(o);
                return;
        for p in [l..r]:
                gen(p+1,r,o+[p])

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)

всем спасибо - все понял

cvv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.