题目大意:给一个n(<=10),然后用n的一个全排列做为第一行,然后相邻2个数做和,放到下一行,这样组成一个倒着的数塔,第n行只剩下了一个sum.现在给你一个n和一个sum,求第一行字典序最小的一个排列.
题目分析:最坏10!复杂度,直接爆搜啦,剪枝都免了,妥妥的
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 11;
int lcm[N][N];
bool flag[N],ok;
int n,sum;
void dfs(int cur,int dp)
{
if(ok)
return;
lcm[1][dp] = cur;
int i;
for(i = 2;i <= dp;i ++)
lcm[i][dp - i + 1] = lcm[i - 1][dp - i + 1] + lcm[i - 1][dp - i + 2];
if(dp == n)
{
if(lcm[n][1] == sum)
{
for(i = 1;i <= n;i ++)
printf("%d%c",lcm[1][i],i == n?'\n':' ');
ok = true;
}
return;
}
for(i = 1;i <= n;i ++)
{
if(!flag[i])
{
flag[i] = true;
dfs(i,dp + 1);
flag[i] = false;
}
}
}
void fuck()
{
memset(flag,false,sizeof(flag));
ok = false;
for(int i = 1;i <= n && !ok;i ++)
{
flag[i] = true;
dfs(i,1);
flag[i] = false;
}
}
int main()
{
while(scanf("%d%d",&n,&sum) != EOF)
{
fuck();
}
return 0;
}