HDUOJ 1518 Square(dfs+剪纸)

这一道题简单dfs,减枝一下就可以了。
不是4的倍数不成立,而且dfs进去直接出来比不进去慢好多。

#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) (x&(-x))
#define eps 1e-8
#define lson l,m,td<<1
#define rson m+1,r,td<<1|1
#define INF 0x3f3f3f3f
#define clear(a) memset(a,0,sizeof a)
#define clear_1(a) memset(a,-1,sizeof a)
#define line puts("");
#define space putchar(' ');
#define LOCALR freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#define LOCALW freopen("C:\\Users\\Administrator\\Desktop\\out.txt","w",stdout);
using namespace std;
/*******************************************************************/
/*******************************************************************/
template<class T>
inline int read(T &x){
    char ch;
    bool flag=false;
    if((ch=getchar())==EOF)return -1;
    for(;!isdigit(ch);ch=getchar())if(ch=='-')flag=true;
    for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
    x=flag?-x:x;
    return 1;
}
template<class T>
inline void write(T x,bool isnewline=false){
    static const int maxlen=100;
    static char s[maxlen];
    if(x<0){putchar('-');x=-x;}
    if(!x){putchar('0');return;}
    int len=0;
    for(;x;x/=10)s[len++]=x%10+'0';
    if(isnewline)puts(s);
    else for(int i=len-1;i>=0;i--)putchar(s[i]);
}
/*******************************************************************/
/*******************************************************************/
int a[22],vis[22],n,sum;
bool dfs(int td,int cur,int now){
    if(td>=3)return true;
    if(now==sum){
        cur=n;
        td++;
        now=0;
    }
    for(int i=cur;i>0;i--){
        if(!vis[i]&&a[i]+now<=sum){
            vis[i]=1;
            if(dfs(td,i-1,now+a[i]))return true;
            vis[i]=0;
        }
    }
    return false;
}
int main(){
    int T;read(T);
    while(T--){
        memset(vis,0,sizeof vis),sum=0;
        read(n);
        for(int i=1;i<=n;i++)read(a[i]),sum+=a[i];
        if(sum&3||(sum>>2)<a[n])puts("no");
        else{
            sum>>=2;
            sort(a+1,a+1+n);
            if(dfs(0,n,0))puts("yes");
            else puts("no");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41635132/article/details/81672558