思路:
使用函数next_permutation()按字典序从大到小的顺序进行全排列,每次更新排列后都检查当前排列是否符合所给条件,若符合输出
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include<iostream>
#include<map>
using namespace std;
#define MAX_A 10000
int main(){
//输入
int n,sum;
scanf("%d %d",&n,&sum);
int i;
int array[n];
for(i=0;i<n;i++){
array[i] = i+1;
}
//按字典序从大到小的顺序进行全排列
do{
int k = n;//k表示剩余的数
int arrayx[n];
for(i=0;i<n;i++){
arrayx[i] = array[i];
}
//模拟得到和的过程
while(k!=1){
int j;
for(j=0;j<k-1;j++){
arrayx[j] = arrayx[j]+arrayx[j+1];
}
k--;
}
if(arrayx[0]==sum){
//输出排列
int j;
for(i=0;i<n-1;i++){
printf("%d ",array[i]);
}
printf("%d\n",array[i]);
break;
}
}while(next_permutation(array,array+n));
return 0;
}