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

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

*** Пермутации [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.

*** Вариации [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]

*** Комбинации [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.

*** Триъгълник на Паскал.
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]

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

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

Тренинг 3
- адаптиране на готови решения
- четене на редове с числа:
#include <sstream>
...
    string line;
    int k;
    while(getline(cin,line))
   {
        vector<int> v;
        istringstream is(line);
        while(is >> k) v.push_back(k);
       ...
     }
- гранични случаи