看到全排列,说明这是一道典型的DFS题目
#include <bits/stdc++.h>
using namespace std;
int a[10]={1,2,3,4,5,6,7,8,9,10};
int sum;
bool vis[10];//表明数字是否用过
int N;//全排列个数
int b[10];//全排列后的序列 (主要是用来备份)
int c[10];//进行计算的序列
void dfs(int s)
{
if(s==N)//DFS确定边界
{
for(int i=0;i<N;i++)
{
c[i]=b[i];//备份
}
int cnt=0;
while(cnt<N)//注意循环次数
{
for(int i=0;i<N-1-cnt;i++)
{
c[i]=c[i]+c[i+1];
}
cnt++;
}
if(c[0]==sum)
{
for(int i=0;i<N;i++)
{
cout<<b[i]<<" ";
}
exit(0);
}
return;
}
for(int i=0;i<N;i++)//主干
{
if(!vis[i])
{
vis[i]=true;
b[s]=a[i];
dfs(s+1);
vis[i]=false;
}
}
return;
}
int main()
{
cin>>N>>sum;
dfs(0);
cout<<"\n";
return 0;
}
这里需要特别说明,这里DFS的全排列其实就是按照字典序排列,所以说得出了一个解之后就没有必要继续算了,直接退出即可