Problem Description
Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
Input
The 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.
Output
For 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#include<stdio.h> #include<string.h> int vist[25],a[25],flog,m,edglen; void DFS(int edgnamber,int edgsum ,int i) { int j,t=i; vist[i]=1; if(edgsum==edglen)//如果相等,则成立了一个边,边数就加1,搜组成下一个边 { edgnamber++;edgsum=0;t=0;//t是下一个边搜的起点,edgsum是边的长度 } if(edgnamber==3)//等于3说明成立了三个边,那么下一边也就不用搜了,直接反回 { flog=1; return ; } for(j=t;j<m;j++) if(!vist[j]&&edgsum+a[j]<=edglen)//动态地加边长 { DFS(edgnamber,edgsum+a[j],j); if(flog) return ; } vist[i]=0; } int main() { int t,i,sum; scanf("%d",&t); while(t--) { sum=0; scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d",&a[i]); sum+=a[i]; } if(sum%4!=0||m<4)//剪枝 { printf("no\n"); continue; } flog=0; edglen=sum/4; memset(vist,0,sizeof(vist)); DFS(0,a[0],0); if(flog) printf("yes\n"); else printf("no\n"); } }