题目描述
按某种顺序在纸上写下 1 ~ N ( 1 < = N < = 10 ) 1~N(1<=N<=10) 1~N(1<=N<=10)之间的所有数,然后把相邻的数字相加,得到一个比原数列少一项的数列。对新数列重复上述的操作,直到整个数列只剩一个数为止。 N = 4 N=4 N=4的时候,整个游戏的流程可能如下所示:
3 1 2 4
4 3 6
7 9
16
对于给定的 N N N以及最后剩下的数,求初始的数列
题目解析
首先,可以很轻松的发现初始序列的每一位的系数就是杨辉三角相对应的数
接着,枚举每个位置的值,乘以系数即可
可以判断当前值若已经大于目标值,则 R e t u r n Return Return
代码
#include<bits/stdc++.h>
using namespace std;
int n,sum;
int tr[25][25],ans[25];
bool flag[25],end;
void dfs(int lev,int t)
{
if(end) return;
if(t>sum) return;
if(lev>n&&t==sum)
{
end=1;
for(int i=1;i<n;i++)
cout<<ans[i]<<" ";
cout<<ans[n];
return;
}
for(int i=1;i<=n;i++)
if(!flag[i])
{
ans[lev]=i;
flag[i]=1;
dfs(lev+1,t+tr[n][lev]*i);
flag[i]=0;
}
}
int main()
{
cin>>n>>sum;
tr[1][1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
tr[i][j]=tr[i-1][j]+tr[i-1][j-1];
dfs(1,0);
return 0;
}