依旧是DFS的练习,剪枝的情况在于长度和不为4的倍数或者最长的长度大于所需的长度,其他好像也没什么要注意的了。
#include<stdio.h>
#include<string.h>
int n,m,num[25],sum;
bool visit[25],flag;
void dfs(int a,int b,int c){
if(flag)
return ;
if(a == 3){
flag = 1;
return ;
}
for(int i = b;i<m;i++){
if(visit[i] || c+num[i] > sum)
continue;
visit[i] = true;
if(c+num[i] < sum)
dfs(a,i,c+num[i]);
else dfs(a+1,0,0);
if(flag) return ;
visit[i] = false;
}
}
int main(){
while(~scanf("%d",&n)){
while(n--){
int max = 0;
sum = 0;
scanf("%d",&m);
memset(visit,false,sizeof(bool)*m);
for(int i = 0;i<m;i++){
scanf("%d",&num[i]);
sum += num[i];
if(num[i] > max)
max = num[i];
}
if(sum % 4 != 0 || sum < 4 || max > sum/4){
printf("no\n");
continue;
}
sum /= 4;
flag = false;
dfs(0,0,0);
if(flag)
printf("yes\n");
else printf("no\n");
}
}
return 0;
}