依然是非常暴力的DFS,1~n这n个数字,全排列一遍,找到第一个符合的排列就是答案。
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,sum,num[11],finish=0; 5 int cal() //已知第一行,计算并return倒三角的最后一行的那个值 6 { 7 int temp[11][11]; 8 for(int i=0;i<n;i++) temp[1][i]=num[i]; 9 for(int i=2;i<=n;i++) 10 { 11 for(int j=0;j<n-i+1;j++) 12 { 13 temp[i][j]=temp[i-1][j]+temp[i-1][j+1]; 14 } 15 } 16 return temp[n][0]; 17 } 18 void dfs(int deep) 19 { 20 if(deep == n && cal() == sum) //如果深度到达n,并且计算得到的Backward Digit Sums与样例给出的相等 21 { 22 for(int i=0;i<n;i++) 23 { 24 if(i != 0) printf(" "); 25 printf("%d",num[i]); //输出数字倒三角的第一行 26 } 27 printf(" "); 28 exit(0); //直接退出程序 29 } 30 for(int i=1;i<=n;i++) 31 { 32 int flag = 1; 33 for(int j = 0; j < deep; j++) if(num[j] == i) flag = 0; 34 if(flag) 35 { 36 num[deep] = i; 37 dfs(deep+1); 38 } 39 } 40 return; 41 } 42 int main() 43 { 44 scanf("%d%d",&n,&sum); 45 dfs(0); 46 }