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 }

 

posted @ 2016-03-03 22:51  cherry_yue  阅读(35)  评论(0)    收藏  举报