1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include<stdio.h> int a[20][20]={{1,1}, {0,1}, {0,1,2,1}, {0,1,3,3,1}, {0,1,4,6,4,1}, {0,1,5,10,10,5,1}, {0,1,6,15,20,15,6,1}, {0,1,7,21,35,35,21,7,1}, {0,1,8,28,56,70,56,28,8,1}, {0,1,9,36,84,126,126,84,36,9,1}, {0,1,10,45,120,210,252,210,120,45,10,1}, {0,1,11,55,165,330,462,462,330,165,55,11,1}, {0,1,12,66,220,495,792,924,792,495,220,66,12,1} }; int n,f=0,max,sum=0,visited[20]={0},ord[20]={0};
void pr(){ int i; for(i=1;i<=n;i++) printf("%d ",ord[i]); }
void dfs(int i){ if(f||sum>max)return; int j; for(j=1;j<=n;j++) if(!visited[j]){ visited[j]=1; ord[i]=j; sum+=a[n-1][i]*j; if(i==n&&sum==max){ pr(); f=1; } else dfs(i+1); sum-=a[n-1][i]*j; visited[j]=0; ord[i]=0; } }
int main(){ int i,j; scanf("%d%d",&n,&max); dfs(1); return 0; }
|