HDU1518:Square(DFS)

Square

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 88   Accepted Submission(s) : 37

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?

Input

The first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.

Output

For each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".

Sample Input

3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5

Sample Output

yes
no
yes

Source

University of Waterloo Local Contest 2002.09.21

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t,i,j,n,m,flag,sum,ans;
int vis[25],a[25];
int cmp(int a,int b)
{
    return a>b;
}
void dfs(int k,int l,int edge)
{
     if(edge==4)
     {
         flag=1;
         return;
     }
  //  if(flag) return;
    for(int i=k;i<=n;i++)
     if (!vis[i])
        if (l+a[i]<=sum)
    {
        vis[i]=1;
        if (l+a[i]==sum)  dfs(1,0,edge+1);
           else dfs(i+1,l+a[i],edge);
        if(flag) return;
        vis[i]=0;
    }
    return;
}
int main()
{

    scanf("%d",&t);
    for(;t>0;t--)
    {
        scanf("%d",&n);
        sum=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }

        if (sum%4!=0)
        {
            printf("no\n");
            continue;
        }

        sort(a+1,a+1+n,cmp);
        sum=sum/4;

        if (a[1]>sum)
        {
            printf("no\n");
            continue;
        }
        memset(vis,0,sizeof(vis));
        flag=0;
        dfs(1,0,1);
        if(flag) printf("yes\n");
          else printf("no\n");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/stepping/p/5667545.html