题意:给定一些木棒
询问是否能够组成正方形
直接暴力 DFS
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 using namespace std; 6 const int maxn = 24; 7 int a[ maxn ]; 8 int vis[ maxn ]; 9 int n ,flag; 10 11 void dfs( int pos,int len,int LEN,int sum ){// 12 if( flag==1 ) 13 return ; 14 if( sum==3 ){ 15 flag=1; 16 return ; 17 } 18 for( int i=pos;i<=n;i++ ){ 19 if( vis[ i ]==0 ){ 20 if( len+a[i]<LEN ){ 21 vis[ i ]=1; 22 dfs( i,len+a[i],LEN,sum ); 23 vis[ i ]=0; 24 } 25 else if( len+a[i]==LEN ){ 26 vis[ i ]=1; 27 dfs( 1,0,LEN,sum+1 ); 28 vis[ i ]=0; 29 } 30 } 31 } 32 return ; 33 } 34 35 int main(){ 36 int t; 37 scanf("%d",&t); 38 while( t-- ){ 39 int sum=0; 40 scanf("%d",&n); 41 for( int i=1;i<=n;i++ ){ 42 scanf("%d",&a[ i ]); 43 sum+=a[ i ]; 44 } 45 if( sum%4!=0 ){ 46 printf("no\n"); 47 continue; 48 } 49 sort( a+1,a+1+n ); 50 if( a[n]>( sum/4 ) ){ 51 printf("no\n"); 52 continue; 53 } 54 memset( vis,0,sizeof( vis )); 55 flag=-1; 56 dfs( 1,0,sum/4,0 ); 57 if( flag!=-1 ){ 58 printf("yes\n"); 59 } 60 else{ 61 printf("no\n"); 62 } 63 } 64 return 0; 65 }