题目大意及解题思路见罗总博客。
参考代码
const int N = 20 + 10;
#define ls rt << 1
#define rs rt << 1 | 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
inline int readint() {int x; scanf("%d", &x); return x;}
int e[N], a[N];
int n, s;
int vis[N];
int c(int n, int m) { //计算组合数C^m_n
int ans = 1;
for(int i = 1; i <= m; ++i){
ans = ans * (n - m + i) / i;
};
return ans;
}
void table() { //打出杨辉三角系数的表的代码
for(int i = 0; i <= (n - 1) / 2; ++i) {
e[i] = e[n - 1 - i] = c(n - 1, i);
}
}
bool flag = false; //标记是否找到答案
void dfs(int id, int sum) {
if (flag || sum > s) return; //如果已经找到答案或当前的和已经超过目标值,退出
if (id == n && sum == s) {
flag = true;
for(int i = 1; i <= n; ++i) {
printf("%d ", a[i]);
}
return;
}
for(int i = 1; i <= n; ++i) {
if (vis[i]) continue;
vis[i] = 1;
a[id + 1] = i;
dfs(id + 1, sum + e[id] * i);
vis[i] = 0;
}
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
n = readint();
s = readint();
table();
dfs(0, 0);
return 0;
}