这是一个可以完成这项工作的代码片段。
#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);
这将返回从 n 个元素中选择 k 个元素的组合数。
该循环计算给定组合之前的组合数。
通过在末尾加一,我们就得到了实际的索引。
对于给定的组合有
c(9, 4) = 126 个包含 1 的组合,因此按字典顺序位于 1 之前。
包含 2 作为最小数的组合有
c(7, 3) = 35 个组合,其中 3 是第二小的数字
c(6, 3) = 20 个组合,其中 4 为第二小的数字
所有这些都在给定组合之前。
包含 2 和 5 作为两个最小数字的组合有
c(4, 2) = 6 个组合,其中 6 是第三小的数字。
所有这些都在给定组合之前。
Etc.
如果在内循环中放置 print 语句,您将得到数字
126、35、20、6、1。
希望能解释一下代码。