字母A,B,C的所有可能的组合(按字典顺序排序)是:A, AB,ABC,AC,B,BC,C 每个组合都对应一个字典顺序的序号,如下所示:
1 A
2 AB
3 ABC
4 AC
5 B
6 BC
7 C
找出编号为K的字母组合。例如,上例中编号为4的组合为AC。
注:假设某个字母组合为X1X2X3…XK,保证X1<…
输入:输入包括2行:
第一行:N,表示字母组合由字母表中前N(N<=26)个字母组成;
第二行:K;
输出:该字母组合;
输入样例:
3
2
输出样例:
AB
分析:这道题和字母组合和poj1850是同一类型的题,细节比较繁琐.方法就是枚举第i位放编号为几的字母,计算放了之后能组成多大编号的字母组合.根据这个范围来判断第i位到底放哪一个字母.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n, k, num[30], tot, c[30][30]; int main() { c[0][0] = 1; for (int i = 1; i <= 30; i++) { c[i][0] = 1; for (int j = 1; j <= 30; j++) c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; } scanf("%d%d", &n, &k); while (k) { int ch, t = 0; if (tot == 0) ch = 1; else ch = num[tot] + 1; int temp = 0; while (ch <= n) { for (int j = tot; j <= n; j++) temp += c[n - ch][j - tot]; if (temp >= k) break; t = temp; ch++; } k -= t + 1; num[++tot] = ch; } for (int i = 1; i <= tot; i++) printf("%c", num[i] - 1 + 'A'); return 0; }