HDU 1518 Square(DFS)

来源:互联网 发布:现货黄金行情软件 编辑:程序博客网 时间:2024/06/08 23:58
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

题意:所有长度的木棍连起来能否组成一个正方形。

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int flag,sum,n;int a[40],vis[40];void dfs(int g,int l,int k){    if(g==4)    {        flag=1;        return;    }    if(l==sum)    {        dfs(g+1,0,0);        if(flag)        return;    }    for(int i=k; i<n; i++)    {        if(!vis[i]&&l+a[i]<=sum)        {            vis[i]=1;            dfs(g,l+a[i],i+1);            if(flag)               return;            vis[i]=0;        }    }}int main(){    int t,i;    scanf("%d",&t);    while(t--)    {        memset(vis,0,sizeof(vis));        sum=0;        flag=0;        scanf("%d",&n);        for(i=0; i<n; i++)        {            scanf("%d",&a[i]);            sum+=a[i];        }        if(sum%4!=0)        {            printf("no\n");            continue;        }        for(i=0; i<n; i++)            if(a[i]>sum)                break;        if(i!=n)        {            printf("no\n");            continue;        }        sum=sum/4;        dfs(0,0,0);        if(flag)            printf("yes\n");        else            printf("no\n");    }}


0 0