HDU 1518 Square 搜索

来源:互联网 发布:手机淘宝联盟自己购买 编辑:程序博客网 时间:2024/05/01 06:50

题目大意:输入n个木棍长度,判断能否组成一个正方形

思路:深搜,并通过几种方法剪枝使时间复杂度降低

#include <iostream>#include<algorithm>using namespace std;int sum, n, len[21], flag;bool isok[21];bool cmp (int a, int b){    return a<b;}void dfs(int lens, int cnt, int left, int th){    if(cnt == 3 && left == sum)    {        flag = 1;        return;    }    if(lens == sum)    {        dfs(0, cnt + 1, left, 0);        return;    }    for(int i = th; i < n; i ++ )    {        if(i != 0)            if(len[i] == len[i-1] && isok[i-1])                continue;        if(lens + len[i] <= sum && isok[i] && ! flag)        {            isok[i] = false;            dfs(lens + len[i], cnt, left - len[i], i + 1);            isok[i] = true;        }    }}int main(){    int t;    cin >> t;    while(t -- )    {        flag = 0;        sum = 0;        cin >> n;        for(int i = 0; i < n; i ++ )        {            cin >> len[i];            isok[i] = true;            sum += len[i];        }        sort(len, len + n);        if(sum % 4 != 0 || n < 4 || sum / 4 < len[n - 1])        {            cout << "no" <<endl;            continue;        }        sum /= 4;        dfs(0, 0, 4 * sum, 0);        if(flag) cout << "yes" << endl;        else cout << "no" <<endl;    }}


0 0
原创粉丝点击