HDU1518 Square
一般的DFS是搜索到一条满足就行了,这种题目是搜索多条满足
题意:用上所有的长度组合成四条相等的边长
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[30],visited[30];
int n,W;
int flag;
void dfs(int cur,int sum,int cnt){
if(cnt==4){flag=1;return;}
if(flag||sum>W)return;
if(sum==W){
dfs(1,0,cnt+1);//关键1,组合成一条后再组合另一条(搜索多条)
return;
}
for(int j=cur;j<=n;j++){//关键2,j从cur而不是从1开始,避免大量重复
if(visited[j]==0){
visited[j]=1;
dfs(j,sum+a[j],cnt);
if(flag)return;
visited[j]=0;
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
W=0;
int Max=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
W+=a[i];
Max=max(Max,a[i]);
}
if(W%4||W/4<Max){printf("no\n");continue;}//小剪枝
W/=4;
memset(visited,0,sizeof(visited));
flag=0;
dfs(1,0,0);
if(flag==1)printf("yes\n");
else printf("no\n");
}
return 0;
}