一道dfs题目

来源:互联网 发布:java桌面开发框架 编辑:程序博客网 时间:2024/04/30 19:09

题意:给出一些长度的线段,不能把这些线段切开,平均分成四组。问是不是可能做到。


这道题很容易超时,优化方式有两个,一个就是对于第一条线段,默认把它放在第一组。第二个就是在枚举每一条边的线段组成时,都只要从上一条所选取得线段后面一条开始枚举即可。


#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define N 100using namespace std;int T, n, s, f, flag[N], a[N], b[N];bool dfs(int d, int l, int t){    if (d > 4) return true;    if (l == s/4)    {        b[0] = 0;        if (dfs(d+1, 0, 1)) return true;        return false;    }    for (int i = b[t-1]+1; i <= n; i++)        if (flag[i] == 0)    {        flag[i] = 1;        b[t] = i;        if (dfs(d,l+a[i],t+1)) return true;        flag[i] = 0;    }    return false;}int main(){    scanf("%d", &T);    while (T--)    {        scanf("%d", &n);        s = 0;        f = 0;        for (int i = 1; i <= n; i++)        {            scanf("%d", &a[i]);            s += a[i];        }         if (s % 4 != 0) f = 1;        if (f == 0)        {            memset(flag, 0, sizeof(flag));            b[1] = 1;            flag[1] = 1;            if (dfs(1,a[1],2)) printf("yes\n");            else printf("no\n");        }        else printf("no\n");    }    return 0;}


0 0
原创粉丝点击