HDU1518 Square

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;
}

你可能感兴趣的:(HDU1518 Square)