题目大意:输入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;
}
}