hdu1518深搜DFS

看队友ac了这个。。加上很久没写过深搜了。。手痒了。。遂拿之解闷~~

一开始超时。。玩命的超时(这次用的printf了)。。查之发现二逼了代码在已经搜过的位置重复搜了几次。。导致代码目测时间复杂度为o(n!)。。玩命啊。。改之。。wa。。顿时想起以前做过之一题目。。即在搜索过程中搜不成功还得回溯。。遂改方法。。ac~

#include<iostream>
#include<algorithm>
using namespace std;
const int MAXM=22;
int m;
int num[MAXM];
bool vis[MAXM];
bool cmp(int a,int b)
{
    return a>b;
}
bool dfs(int remd,int pos,int count,int len)
{
    int i;
    if(count==4)
    {
        return 1;
    }
    
    for(i=pos;i<=m-1;i++)
    {
        if((!vis[i])&&remd>=num[i])
        {
            vis[i]=1;
            remd=remd-num[i];
            if(remd==0&&dfs(len,0,count+1,len))
            {
                return 1;
            }else if(dfs(remd,i+1,count,len))
            {
                return 1;
            }
            remd=remd+num[i];
            vis[i]=0;
        }
    }
    return 0;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i;
        memset(vis,0,sizeof(vis));
        int sum=0;
        scanf("%d",&m);
        for(i=0;i<=m-1;i++)
        {
            scanf("%d",&num[i]);
            sum+=num[i];
        }
        if(sum%4)
        {
            printf("no\n");
            continue;
        }
        sort(num,num+m,cmp);
        if(sum/4<num[0])
        {
            printf("no\n");
            continue;
        }
        if(dfs(sum/4,0,0,sum/4))
        {
            printf("yes\n");
        }else
        {
            printf("no\n");
        }
        
    }
    return 0;
}

  

本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
独立博客:http://nfeng.cc/
原文地址:https://www.cnblogs.com/cj695/p/2620258.html