poj 3187 Backward Digit Sums(DFS 生成排列)
深度遍历生成可能结果的排列,正推看是否为sum,思路很清晰
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 int vis[10]; 8 int sum,n,k; 9 void dfs(int a[],int cur) 10 { 11 if(cur==n) 12 { 13 int m=n; 14 int c[n]; 15 for(int i=0; i<n; i++) c[i]=a[i]; 16 /* for(int i=0; i<n; i++) 17 printf("%d ",c[i]); 18 printf("\n"); 19 */ 20 while(m>1) 21 { 22 m--; 23 int b[m]; 24 for(int i=0; i<m; i++) 25 { 26 b[i]=c[i]+c[i+1]; 27 } 28 for(int i=0; i<m; i++) 29 { 30 c[i]=b[i]; 31 } 32 } 33 if(c[0]==sum) 34 { 35 for(int i=0; i<n; i++) 36 printf("%d ",a[i]); 37 k=1; 38 return; 39 } 40 // else printf("%d\n",c[0]); 41 } 42 for(int i=0; i<n&&!k; i++) 43 { 44 if(!vis[i]) 45 { 46 a[cur]=i+1; 47 vis[i]=1; 48 dfs(a,cur+1); 49 vis[i]=0; 50 } 51 } 52 } 53 int main() 54 { 55 k=0; 56 cin>>n>>sum; 57 memset(vis,0,sizeof(vis)); 58 int a[n]; 59 dfs(a,0); 60 return 0; 61 }

浙公网安备 33010602011771号