Kомбинаторни алгоритми.  Разбиване на числа

План:
Домашно
Пермутации
Вариации
Комбинации
Триъгълник на Паскал
Разбиване на числа


Kомбинаторни алгоритми [1.3]

*** Пермутации (Permutations) [1.3.1] - наредени n-торки.
А. Без повторения { 1 2 3 }
123  132  213  231  312  321
Общ брой n!
[permute.cpp]

Б. С повторения { 1 1 2 3 }
1123  1132  1213  1231  1312  1321  2113  2131  2311  3112  3121  3211
Общ брой n!/(s1!s2!...sk!), където si! е броят на i-тия различен елемент, участващ в мултимножеството. В примера 4!/(2!1!1!) = 12.

next_permutatiom


*** Вариации (k-permutations of n) [1.3.2] - нареден k-елементен списък измежду n елемента.
А. Без повторения n = 3 { 1 2 3 },  k = 2
12  13  21  23  31  32
Общ брой n!/(n - k)!  В примера 3!/1 = 6.

Б. С повторения n = 3 { 1 2 3 },  k = 2
11  12  13  21  22  23  31  32  33
Общ брой nk. В примера 32 = 9.
[variate.cpp]


*** Комбинации (Combinations) [1.3.3] k-елементно подмножество измежду n елемента (ненаредено).

А. Без повторения  n = 5 { 1 2 3 4 5 },  k = 2
12  13  14  15  23  24  25  34  35  45
Общ брой n!/((n - k)!k!).  В примера 5!/(3!2!) = 10.
[comb.cpp]

Б. с повторения n = 5 { 1 2 3 4 5 },  k = 2
11  12  13  14  15  22  23  24  25  33  34  35  44  45  55
Общ брой (n + k - 1)! / ((n - 1)! k!).  В примера 6!/(4!2!) = 15.

*** Триъгълник на Паскал (Pascal's triangle).
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
....


Разбиване на числа [1.3.4]

*** Разбиване на число като сума от естествени числа

Пример: Да се генерират всички разбивания на числото 7.
devnum.c

7
6+1
5+2
5+1+1
4+3
4+2+1
4+1+1+1
3+3+1
3+2+2
3+2+1+1
3+1+1+1+1
2+2+2+1
2+2+1+1+1
2+1+1+1+1+1
1+1+1+1+1+1+1


*** Разбиване на число като сума от дадени числа
Пример: Да се генерират всички разбивения на числото 15 с числата 2, 3 и 5.
devnum3.c

5+5+5
5+5+3+2
5+3+3+2+2
5+2+2+2+2+2
3+3+3+3+3
3+3+3+2+2+2
3+2+2+2+2+2+2