HDU 1518 Square 深搜

http://acm.hdu.edu.cn/showproblem.php?pid=1518

题意:

  给出M根棍子,要将所有棍子用上,拼成一个正方形。

 

坑爹:

  用深搜时递归容易超时。

 

解法:

  剪枝:用一个pos来记录当前搜索到的位置,当下次继续加一个棍子时从pos位置开始,因为前面的可以加的都已经标记过了,而每递归一次都要从头

开始搜索,浪费了很多时间。

 

View Code
 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int maxn = 20 + 10;
 5 int num[maxn];
 6 bool used[maxn];        
 7 int M;
 8 int sum;
 9 int flag;
10 
11 int DFS(int d,int cnt,int pos)
12 {
13     if(d == sum)
14     {
15         d=0;
16         pos=0;
17         cnt++;
18     }
19     if(cnt == 4)
20     {
21         flag = 1;
22         return 1;
23     }
24     int i;
25     for(i=pos; i<M; i++)
26     {
27         if(!used[i])
28         {
29             used[i] = 1;
30             if(num[i]+d <= sum)
31             {
32                 if(DFS(num[i]+d,cnt,i+1) == 1)
33                 {
34                     return 1;
35                 }
36             }
37             used[i] = 0;
38         }
39     }
40     return 0;
41 }
42 
43 int main()
44 {
45     int N;
46     cin>>N;
47     while(N--)
48     {
49         memset(used,0,sizeof(used));
50         int i;
51         sum = 0;
52         cin>>M;
53         for(i=0; i<M; i++)
54         {
55             cin>>num[i];
56             sum += num[i];
57         }
58         if(sum%4 != 0)
59         {
60             cout<<"no"<<endl;
61             continue;
62         }
63         sum/=4 ;
64         flag=0;
65         DFS(0,0,0);
66         if(flag)
67         {
68             cout<<"yes"<<endl;
69         }
70         else
71         {
72             cout<<"no"<<endl;
73         }
74     }
75     return 0;
76 }

 

posted @ 2012-09-03 19:56  pc....  阅读(237)  评论(0)    收藏  举报