HDU1518(深搜+剪枝)

来源:互联网 发布:淘宝店更改主营类目 编辑:程序博客网 时间:2024/05/24 05:27

尝试了一下书上的代码。发现新的写法

再次此前我都是定义一个全局变量flag代表是否搜到结果,如果搜到结果就return,最终返回main。而书上则是把return写在进入下一层搜索的if语句中。

/** * hdu1518 * 深搜+剪枝 * * 剪枝方法: * 1。木棍数和是4的倍数 * 2。在1。满足的情况下找到三个边,第四个边不用找了 * 3。可以从大数开始找 */#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int mmax = 25;int l;int n;int sticks[mmax];bool visit[mmax];//第一次见这种巧妙写法,还是得多想呀bool dfs(int k, int len, int cnt){    if(cnt == 3)    {        return true;    }    for(int i = k; i >= 0; i--)    {        if(!visit[i])        {            visit[i] = 1;            if(len + sticks[i] == l)            {                if(dfs(n-1, 0, cnt+1))                {                    return true;                }            }            else if(len + sticks[i] < l)            {                if(dfs(i-1, len+sticks[i], cnt))                {                    return true;                }            }            visit[i] = false;        }    }    return false;}int main(){    int t;    scanf("%d", &t);    while(t--)    {        memset(visit, 0, sizeof(visit));        int sum = 0;        scanf("%d", &n);        for(int i = 0; i < n; i++)        {            scanf("%d", &sticks[i]);            sum += sticks[i];        }        l = sum / 4;        sort(sticks, sticks+n);        //剪枝        if(sum % 4 != 0 || n < 4 || l < sticks[n-1])        {            printf("no\n");            continue;        }        if(dfs(n-1, 0, 0))            printf("yes\n");        else            printf("no\n");    }    return 0;}
原创粉丝点击