题目大意:给出杨辉三角的行数N,和顶端值M,求最底层1~N怎样排列才能使顶端值M。输出字典序最小的组合
分析:先求杨辉三角底层各个数的系数,然后,DFS就可以得到答案
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[15], n, cur, k, flag, vis[15], c[15][15];
void dfs() {
if(k == n+1) {
int res = 0;
for(int i = 1; i <= n; i++) {
res = res + c[n][i] * a[i]; //得到的排列分别乘以相应系数后相加
}
if(res == cur) {
for(int i = 1; i < n; i++)
printf("%d ", a[i]);
printf("%d\n", a[n]);
flag = 1; //找到字典序最小后,及时退出,以免超时
}
return;
}
for(int i = 1; i <= n; i++) {
if(flag) return;
if(!vis[i]) {
a[k++] = i;
vis[i] = 1;
dfs();
vis[i] = 0;
k--;
}
}
}
int main() {
scanf("%d%d", &n, &cur);
memset(vis, 0, sizeof(vis));
memset(c, 0, sizeof(c));
c[0][0] = 1;
for(int i = 1; i <= n; i++) //求杨辉三角底层的系数
for(int j = 1; j <= i; j++)
c[i][j] = c[i-1][j-1] + c[i-1][j];
k = 1;
flag = 0;
dfs();
return 0;
}