http://acm.hdu.edu.cn/showproblem.php?pid=1518
经典DFS+截枝
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 105;
const int inf = 1<<30;
int n,flag,L;
int len[maxn];
bool vis[maxn];
bool cmp( int a,int b )
{
return a > b;
}
void DFS( int l,int count,int k )
{
if( count == 4 )
{
flag = 1;
return;
}
if( flag )
return;
for( int i = k; i <= n; i ++ )
{
if( l+len[i] <= L && !vis[i] )
{
vis[i] = true;
if( l+len[i] == L )
{
DFS( 0,count+1,1 );
}
else
DFS( l+len[i],count,i+1 );
vis[i] = false;
if( flag || !l )
return;
for( int j = i + 1; j <= n; j ++ )
{
if( len[j] != len[j-1] )
{
i = j - 1;
break;
}
}
}
}
}
int main()
{
//freopen("data.txt","r",stdin);
int t,sum;
scanf("%d",&t);
while( t-- )
{
sum = 0;
scanf("%d",&n);
for( int i = 1; i <= n; i ++ )
{
scanf("%d",&len[i]);
sum += len[i];
}
if( sum%4 )
puts("no");
else
{
flag = 0;
L = sum/4;
sort(len+1,len+n+1,cmp);
memset( vis,0,sizeof(vis) );
DFS(0,0,1);
if( flag )
puts("yes");
else
puts("no");
}
}
return 0;
}