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

说明

狗哥快抓狂了

题目大意:t组测试 n个木棒 是否能拼成一个正方形

题解:

dfs.

a、因为木棒都要用完,所以木棒的长度和%4!=0 直接输出No

b、最长的木棒大于求出的正方形的边 输出no (sum/4)

代码:

洛谷上面一个代码很好...我加了b的判断

我写的略丑..=L=

搜索用完n个木棒。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int t,n,sum,flag,maxx,w[5],a[22];
void dfs(int q){
    if(q==n+1){flag=1;return;}
    if(flag)return;
    for(int i=1;i<=4;i++){
        if(w[i]>=a[q]){
            w[i]-=a[q];
            dfs(q+1);
            w[i]+=a[q];
        }
    }
}
int main(){
    scanf("%d",&t);
    while(t--){
        sum=0;flag=0;maxx=-0x7ffffff;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum+=a[i];maxx=max(maxx,a[i]);
        }
        if(sum%4){
            printf("no
");
            continue;
        }
        if(maxx>sum/4){
            printf("no
");
            continue;
        }
        for(int i=1;i<=4;i++)
        w[i]=sum/4;
        sort(a+1,a+n+1,greater<int>());
        dfs(1);
        if(flag)printf("yes
");
        else printf("no
");
    }
    return 0;
}

换个风格

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int t,n,a[22],flag,sum,maxx,vis[22];
void dfs(int l,int v){
    if(v==3&&l==sum){flag=1;return;}
    if(flag)return;
    if(l==sum)l=0,v+=1;
    for(int i=1;i<=n;i++){
        if(!vis[i]&&l+a[i]<=sum){
            vis[i]=1;
            dfs(l+a[i],v);
            vis[i]=0;
        }
    }
}
int main(){
    scanf("%d",&t);
    while(t--){
        flag=0;sum=0;maxx=-0x7ffff;
        scanf("%d",&n);
        maxx=-0x7ffffff;sum=0;
        for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];maxx=max(maxx,a[i]);}
        if(sum%4||maxx>sum/4){printf("no
");continue;}
        sum/=4;
        sort(a+1,a+n+1,greater<int>());
        dfs(0,0);
        if(flag)printf("yes
");
        else printf("no
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zzyh/p/7470659.html