洛谷 P2383 狗哥玩木棒

题目背景

狗哥又趁着语文课干些无聊的事了...

题目描述

现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢?

输入输出格式

输入格式:

 

输入文件中的第一行是一个整数n表示测试的组数,接下来n行表示每组的测试数据。 每行的第一个数为m(4<=m<=20),接下来m个数ai(1<=ai<=1000)表示木棒的长度。

 

输出格式:

 

对于每组测试数据,如果可以组成正方形输出“yes”,否则输出“no”。

 

输入输出样例

输入样例#1:
3
4 1 1 1 1 
5 10 20 30 40 50 
8 1 7 2 6 4 4 3 5
输出样例#1:
yes
no
yes

说明

狗哥快抓狂了

 

dfs

屠龙宝刀点击就送

#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
using namespace std;
inline void Read(int &x)
{
    register char ch=getchar();
    for(x=0;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);x=x*10+ch-'0',ch=getchar());
}
bool flag,use[21];
int n,m,a[21],sum;
void dfs(int now,int num,int z)
{
    if(flag) return;
    if(num==4&&z==m) {flag=1;return;} 
    for(int i=1;i<=m;++i)
    {
        if(!use[i]&&now+a[i]<=sum)
        {
            use[i]=1;
            (now+a[i])%sum==0?dfs((now+a[i])%sum,num+1,z+1):dfs((now+a[i])%sum,num,z+1);
            use[i]=0;
        }
    }
}
int main()
{
    Read(n);
    for(;n--;)
    {
        sum=0;
        flag=0;
        Read(m);
        for(int i=1;i<=m;++i) Read(a[i]),sum+=a[i];
        if(sum%4) {printf("no\n");continue;}
        sort(a+1,a+1+m);
        sum/=4;
        dfs(0,1,1);
        if(flag) printf("yes\n");
        else printf("no\n");
    }
    return 0;
}

 

posted @ 2017-09-04 20:05  杀猪状元  阅读(304)  评论(0编辑  收藏  举报