数字三角形
4 16
3 1 2 4
3 1 2 4
(3+1) (1+2) (2+4)
(3+1+1+2) (1+2+2+4)
(3+1+1+1+2+2+2+4)
16=1*3+3*1+3*2+1*4
首先,我们可以发现每个数字被加上的次数是一个杨辉三角形的一行
利用公式C(n,i)=(n-i+1)*C(n,i-1)/i 可以推出系数
然后爆搜,加一点小剪枝
1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 using namespace std; 6 #define N 15 7 int n,sum,C[N],a[N]; 8 bool used[N]; 9 void print(){ 10 for(int i=1;i<=n;i++) 11 cout<<a[i]<<' '; 12 exit(0); 13 } 14 void dfs(int t,int m){ 15 if(m>sum) return; 16 if(t==n+1){ 17 if(m==sum) print(); 18 return; 19 } 20 for(int i=1;i<=n;i++) 21 if(!used[i]){ 22 used[i]=1; 23 a[t]=i; 24 dfs(t+1,m+i*C[t]); 25 used[i]=0; 26 } 27 } 28 int main() 29 { 30 scanf("%d%d",&n,&sum); 31 C[1]=1; 32 for(int i=2;i<=n;i++) 33 C[i]=(n-i+1)*C[i-1]/(i-1); 34 dfs(1,0); 35 return 0; 36 }