1:题目分析
那么我只需要枚举1~n位置上的数,看哪个符合要求。
2:补充:
一个数只能用一次,因为结果是1~n的排列(最后组成肯定是1~n的每个数都出现过)。
3: ACcode(加注释):
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int c[N][N],a[N],n,SUM;
bool vis[N];
void dfs(int pos,int sum){//1~n的第几个数,当前几个数的造成地和
if(sum>SUM) return;//超时最终值肯定不符合,剪枝掉
if(pos>n){//n个数选完了
if(sum==SUM){//刚好
//由于当是从1开始枚举所以,第一个答案就是字典序最小的
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
exit(0);//找到了,就exit,不然直接return还是会继续dfs的
//return只是推出当前循环
}
return;
}
for(int i=1;i<=n;i++){//枚举
//一个数只能用一次,因为是1~n的排列
//(最后组成肯定是1~n的每个数都出现过)
if(vis[i]) continue;
vis[i]=true;
a[pos]=i;
dfs(pos+1,sum+i*c[n][pos]);
vis[i]=false;
}
}
void solve(){
cin>>n>>SUM;
//预处理计算杨辉三角
c[1][1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
c[i][j]=c[i-1][j]+c[i-1][j-1];
dfs(1,0);//开搜
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int tt=1;
//cin>>tt;
while(tt--)
solve();
return 0;
}
over~