题意:给定n和sum,使得1-n的n个连续的数字排列后,每相邻两个相加直到只剩一个数的时候,这个数等于sum,要求输出最小的字典序的答案。
思路:先预处理出杨辉三角形的矩阵,然后对1-n这n个数全排列,计算是否等于sum,等于就可以直接输出答案了。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[15];
int p[15][15];
int main()
{
ios::sync_with_stdio(false);
int i,j;
///杨辉三角形矩阵
p[1][1]=p[2][1]=p[2][2]=1;
for(i=3;i<=11;i++)
{
for(j=1;j<=i;j++)
p[i][j]=p[i-1][j]+p[i-1][j-1];
}
int n,sum;
while(cin>>n>>sum)
{
for(i=1;i<=n;i++)
a[i]=i;
///全排列
do
{
int sum1=0;
for(i=1;i<=n;i++)
sum1+=a[i]*p[n][i];
if(sum1==sum)break;
}while(next_permutation(a+1,a+n+1));
for(i=1;i<=n;i++)
{
cout<<a[i];
cout<<(i==n?"\n":" ");
}
}
}