hdu 1518 Square 木棍建正方形【DFS】

题目链接

题目大意:

题意就是输入棍子的数量和每根棍子的长度,看能不能拼成正方形。
#include <bits/stdc++.h>
using namespace std;

int n,m,sum,cur;
int arr[25],vis[25];
bool fp;
bool mycmp(int a,int b){ return a>b; }

void dfs(int s,int len,int num){    //当前位置,目前长度,成功条数
    if(num==4){ fp=true;return; }
    if(len==cur)dfs(1,0,num+1);   //如果这一轮凑够了一根木棍,那么接下来继续从第一根开始搜索
    for(int i=s;i<=n;i++){
        if(!vis[i] && len+arr[i]<=cur){
            vis[i]=1;    //当前木棍选或者不选
            dfs(i+1,len+arr[i],num);
            vis[i]=0;
            if(fp)return;     //如果已经成功,所有搜索分支全部暂停
        }
    }    
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        memset(vis,0,sizeof(vis));
        scanf("%d",&n);
        sum=0;
        for(int i=1;i<=n;i++){ scanf("%d",&arr[i]),sum+=arr[i]; }
        sort(arr+1,arr+1+n,mycmp);    //优化搜索顺序
        cur=sum/4;
        if(sum%4!=0 || cur<arr[1])puts("no");
        else{
            fp=false;
            dfs(1,0,0);
            fp?puts("yes"):puts("no");
        }
    }
}

 

转载于:https://www.cnblogs.com/00isok/p/8681331.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值