暴力搜索。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int list[10][10];
int ans[12] = {9, 9};
int sub[12];
int n, fsum;
void cmp()
{
int i;
for (i = 0; i < n && ans[i] == sub[i]; i++) {
;
}
if (ans[i] != 10 && ans[i] > sub[i]) {
for (i = 0; i < n; i++) {
ans[i] = sub[i];
}
}
}
int main()
{
for (int i = 0; i < 10; i++) {
list[i][0] = 1;
}
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
list[i][j] = list[i-1][j-1] + list[i-1][j];
}
}
scanf("%d%d", &n, &fsum);
do {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i] * list[n-1][i];
}
if (sum == fsum) {
for (int i = 0; i < n; i++) {
sub[i] = a[i];
}
cmp();
}
} while (next_permutation(a, a + n));
for (int i = 0; i < n; i++) {
printf("%d", ans[i]);
if (i != n - 1) {
putchar(' ');
}
}
putchar('\n');
return 0;
}
需要指出的是
本题就像一棵倒置的树,根节点的值等于叶子数值与排列组合数的乘积之和。
因此先列出一张杨辉三角表。根据查表得出每种情况对应的总数,再于题目要求的值比较。