HDU - 1518 :Square

Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
InputThe first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.
OutputFor each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".
Sample Input

3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5

Sample Output

yes
no
yes

组成正方形的题,时间给的比较多,不需要过多的剪枝,直接暴力DFS就过了。
 1 #include<iostream>
 2 #include<string.h>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 bool flag;
 8 
 9 int a[25],t,sum,b[25];
10 
11 
12 void DFS(int x,int y,int z)
13 {
14     if(flag)
15         return;
16     if(x==4)
17         flag=true;
18     if(flag)
19         return;
20     if(y==sum/4)
21         DFS(x+1,0,0);
22     if(flag)
23         return ;
24     for(int i=z;i<t;i++)
25     {
26         if(!b[i]&&y+a[i]<=sum/4)
27         {
28             b[i]=1;
29             DFS(x,y+a[i],i+1);
30             b[i]=0;
31             if(flag)
32                 return ;
33 
34         }
35     }
36 }
37 
38 int main()
39 {
40     int n;
41     cin>>n;
42     while(n--)
43     {
44         cin>>t;
45         flag=false;
46         memset(a,0,sizeof(a));
47         memset(b,0,sizeof(b));
48         int f=1,max=0;
49         sum=0;
50         for(int i=0;i<t;i++)
51         {
52             cin>>a[i];
53             sum+=a[i];
54             if(a[i]>max)
55                 max=a[i];
56         }
57         if(sum%4||max>sum/4)
58             flag=false;
59             else 
60             {
61                 sort(a,a+t);
62                 DFS(0,0,0);
63             }
64         if(flag)
65             cout<<"yes"<<endl;
66             else
67                 cout<<"no"<<endl;    
68         
69     }
70     
71     return 0;
72 }

 

posted @ 2017-07-28 20:11  西北会法语  阅读(133)  评论(0编辑  收藏  举报