看看我的吧,这题减枝条件很多
```
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[25], n, m;
int b[25];
bool l;
void dfs( int step , int b1, int b2, int b3, int b4 )
{
int x = max( b1, max( b2, max( b3, b4 ) ) );
if( x - b1 + x - b2 + x - b3 + x - b4 > b[step] ) return ;
if( l == 1 ) return ;
if( max( b1, max( b2, max( b3, b4 ) ) ) - min( b1, min( b2, min( b3, b4 ) ) ) > b[step] )
{
return ;
}
if( step == 1 )
{
if( b1 + a[step] == b2 && b2 == b3 && b3 == b4 ) l = 1;
else if( b1== b2 && b2 + a[step] == b3 && b3 == b4 ) l = 1;
else if( b1 == b2 && b2 == b3 && b3 + a[step] == b4 ) l = 1;
else if( b1 == b2 + a[step] && b2 + a[step] == b3 && b3 == b4 ) l = 1;
else if( b1 == b2 && b2 == b3 + a[step] && b3 + a[step] == b4 ) l = 1;
else if( b1 == b2 && b2 == b3 && b3== b4 + a[step] ) l = 1;
else if( b1 + a[step] == b2 && b2 == b3 && b3== b4 + a[step] ) l = 1;
// cout << b1 << " " << b2 << " " << b3 << " " << b4 << endl;
return ;
}
dfs( step - 1, b1 + a[step], b2, b3, b4 );
dfs( step - 1, b1, b2 + a[step], b3, b4 );
dfs( step - 1, b1, b2, b3 + a[step], b4 );
dfs( step - 1, b1, b2, b3, b4 + a[step] );
}
int main()
{
cin >> n;
while( n > 0 )
{
scanf( "%d", &m );
for( int i = 1; i <= m; i ++ )
{
scanf( "%d", &a[i] );
}
sort( a + 1, a + m + 1 );
for( int i = 1; i <= m; i ++ )
{
b[i] = b[i - 1] + a[i];
}
dfs( m, 0, 0, 0, 0 );
if( l ) printf( "yes\n" );
else printf( "no\n" );
l = 0;
n --;
}
return 0;
}
```
by caoshurui @ 2022-10-05 22:08:49
@[Iverson_](/user/602519)
by caoshurui @ 2022-10-05 22:09:14