DFS搜索,是stick的简化版本
#include <stdio.h>

#include 
<stdlib.h>

int stick[64];

int used[64];

int n, m, len;

void init ( int n )
{

    
for ( int i=1; i<n; i++ )
    
{
        used[i] 
= 0;
    }

    used[
0= 1;
}


int cmp ( const void *a, const void *b )
{

    
return *int * )b - *int * )a;
}


int dfs ( int start, int no, int cur, int last )
{

    
int i, j;

    
if ( ! last )
    
{
        
if ( cur == len )
        
{
            
return 1;
        }

        
return 0;
    }


    
if ( cur == len )
    
{
        
if ( m - no > last )
        
{
            
return 0;
        }


        
for ( i=1; i<n; i++ )
        
{
            
if ( ! used[i] )
            
{
                
break;
            }

        }

        used[i] 
= 1;
        
if ( dfs ( i+1, no+1, stick[i], last-1 ) )
        
{
            
return 1;
        }

        used[i] 
= 0;
        
return 0;
    }

    
else
    
{
        
if ( m - no > last - 1 )
        
{
            
return 0;
        }

        
        
for ( i=start; i<n; i++ )
        
{
            
if ( ! used[i] && cur+stick[i] <= len )
            
{
                used[i] 
= 1;
                
if ( dfs ( i+1, no, cur+stick[i], last-1 ) )
                
{
                    
return 1;
                }

                used[i] 
= 0;

                
for ( j=i+1; j<n; j++ )
                
{
                    
if ( stick[i] != stick[j] )
                    
{
                        
break;
                    }

                }

                i 
= j - 1;
            }

        }

        
return 0;
    }

}


int main ()
{

    
int t, max, sum;

    
while ( scanf ( "%d"&t ) != EOF )
    
{
        
while ( t -- )
        
{
            scanf ( 
"%d"&n );
            sum 
= 0;
            max 
= -1;
            
for ( int i=0; i<n; i++ )
            
{
                scanf ( 
"%d"&stick[i] );
                sum 
+= stick[i];
                
if ( max < stick[i] )
                
{
                    max 
= stick[i];
                }

            }


            m 
= 4;
            
if ( sum % m )
            
{
                printf ( 
"no\n" );
            }

            
else
            
{
                
if ( sum / m < max )
                
{
                    printf ( 
"no\n" );
                }

                
else
                
{
                    init ( n );
                    len 
= sum / m;
                    
if ( dfs ( 11, stick[0], n-1 ) )
                    
{
                        printf ( 
"yes\n" );
                    }

                    
else
                    
{
                        printf ( 
"no\n" );
                    }

                }

            }

        }

    }

    
return 0;
}