Вот фрагмент, который будет выполнять эту работу.
#include <iostream>
int main()
{
const int n = 10;
const int k = 5;
int combination[k] = {2, 5, 7, 8, 10};
int index = 0;
int j = 0;
for (int i = 0; i != k; ++i)
{
for (++j; j != combination[i]; ++j)
{
index += c(n - j, k - i - 1);
}
}
std::cout << index + 1 << std::endl;
return 0;
}
Предполагается, что у вас есть функция
int c(int n, int k);
, которая будет возвращать количество комбинаций выбора k элементов изn элементов.Цикл вычисляет количество комбинаций, предшествующих данной комбинации.Добавляя единицу в конце, мы получаем фактический индекс.
Для данной комбинации существует c (9, 4) = 126 комбинаций, содержащих 1 и, следовательно, предшествующих ему в лексикографическом порядке.
Изкомбинации, содержащие 2 в качестве наименьшего числа, имеют значение
c (7, 3) = 35 комбинаций, имеющих 3 в качестве второго наименьшего числа
c (6, 3) = 20 комбинаций, имеющих 4 ввторое наименьшее число
Все они предшествуют данной комбинации.
Из комбинаций, содержащих 2 и 5 в качестве двух наименьших чисел, имеются
c (4, 2) = 6 комбинаций, в которых третьим наименьшим числом является цифра 6.
Все они предшествуют данной комбинации.
И т. Д.
Если поместить оператор печати во внутреннийЦикл, вы получите номера 126, 35, 20, 6, 1. Надеюсь, что объясняет код.