这一道题简单dfs,减枝一下就可以了。
不是4的倍数不成立,而且dfs进去直接出来比不进去慢好多。
#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) (x&(-x))
#define eps 1e-8
#define lson l,m,td<<1
#define rson m+1,r,td<<1|1
#define INF 0x3f3f3f3f
#define clear(a) memset(a,0,sizeof a)
#define clear_1(a) memset(a,-1,sizeof a)
#define line puts("");
#define space putchar(' ');
#define LOCALR freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#define LOCALW freopen("C:\\Users\\Administrator\\Desktop\\out.txt","w",stdout);
using namespace std;
/*******************************************************************/
/*******************************************************************/
template<class T>
inline int read(T &x){
char ch;
bool flag=false;
if((ch=getchar())==EOF)return -1;
for(;!isdigit(ch);ch=getchar())if(ch=='-')flag=true;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
x=flag?-x:x;
return 1;
}
template<class T>
inline void write(T x,bool isnewline=false){
static const int maxlen=100;
static char s[maxlen];
if(x<0){putchar('-');x=-x;}
if(!x){putchar('0');return;}
int len=0;
for(;x;x/=10)s[len++]=x%10+'0';
if(isnewline)puts(s);
else for(int i=len-1;i>=0;i--)putchar(s[i]);
}
/*******************************************************************/
/*******************************************************************/
int a[22],vis[22],n,sum;
bool dfs(int td,int cur,int now){
if(td>=3)return true;
if(now==sum){
cur=n;
td++;
now=0;
}
for(int i=cur;i>0;i--){
if(!vis[i]&&a[i]+now<=sum){
vis[i]=1;
if(dfs(td,i-1,now+a[i]))return true;
vis[i]=0;
}
}
return false;
}
int main(){
int T;read(T);
while(T--){
memset(vis,0,sizeof vis),sum=0;
read(n);
for(int i=1;i<=n;i++)read(a[i]),sum+=a[i];
if(sum&3||(sum>>2)<a[n])puts("no");
else{
sum>>=2;
sort(a+1,a+1+n);
if(dfs(0,n,0))puts("yes");
else puts("no");
}
}
return 0;
}