HDU 1518 Squre

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


 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int t,m,num[22],sum,target;
 7 bool vis[22];
 8 bool cmp(int a,int b)
 9 {
10     return a<b;
11 }
12 bool dfs(int sum,int cnt,int k)
13 {
14     if(cnt==3) return true;
15     for(int i=k;i>=1;i--)
16     {
17         if(vis[i]==0)
18         {
19             vis[i]=1;//递归的精髓就是回溯
20             if(sum+num[i]==target
21             {
22                 if(dfs(0,cnt+1,m)) return true;
23             }
24             else if(sum+num[i]<target)
25             {
26                 f(dfs(sum+num[i],cnt,i-1)) return true;
27             }
28             vis[i]=0;
29         }
30     }
31     return false;
32 }
33 int main()
34 {
35    // freopen("cin.txt","r",stdin);
36     scanf("%d",&t);
37     while(t--)
38     {
39         scanf("%d",&m);
40         sum=0;
41         for(int i=1;i<=m;i++) {
42             scanf("%d",&num[i]);
43             sum+=num[i];
44         }
45         memset(vis,0,sizeof(vis));
46         target=sum/4;
47         if(m<=3||sum%4!=0) puts("no");
48         else if(dfs(0,0,m)) puts("yes");
49         else puts("no");
50     }
51     return 0;
52 }

猜你喜欢

转载自www.cnblogs.com/linda-/p/13382931.html
hdu