先由杨辉三角的性质:sum =C(n-1,0)*num[0] + C(n-1,1)*num[1] +``+ C(n-1,n-1)*num[n-1],先求出底边各个数对应的系数值,然后再暴搜枚举num[i]的值。
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
#define N 30003
#define ll __int64
using namespace std;
int c[11][11];
int used[12],b[12];
int n,s,f;
void dfs(int x)
{
if(f) return;
if(x==n)
{
int tep=0;
for(int i=0;i<n;i++) tep+=c[n-1][i]*b[i];
if(tep==s)
{
f=1;
for(int i=0;i<n;i++) printf(i==n-1?"%d\n":"%d ",b[i]);
}
return ;
}
for(int i=1;i<=n;i++)
{
if(used[i]==0)
{
used[i]=1;
b[x]=i;
dfs(x+1);
used[i]=0;
if(f) return;
}
}
}
int main()
{
memset(c,0,sizeof(c));
int i,j;
for(i=0; i<=11; i++)
{
c[i][0]=c[i][i]=1;
for(j=1; j<i; j++)
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
while(scanf("%d%d",&n,&s)!=-1)
{
memset(used,0,sizeof(used));
f=0;
dfs(0);
}
return 0;
}