HDU 1518
题意:给定一组数,问是否由以这些数为长度的小木棒组成一个正方形。
思路:用dfs递归求解。
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <algorithm>
#include <functional>
#define debug(x) cout << "--------------> " << x << endl
using namespace std;
const double PI = acos(-1.0);
const double eps = 1e-10;
const long long INF = 0x7fffffff;
const long long MOD = 1000000007;
const int MAXN = 20 + 7;
int l[MAXN], vis[MAXN], n, m, len;
bool flag;
void dfs(int cnt, int sum, int pos)
{
if(cnt == 4) flag = true;
if(flag) return ;
for(int j = pos; j < m; ++j)
{
if(vis[j] && l[j] <= sum)
{
vis[j] = 0;
if(l[j] == sum)
dfs(cnt+1, len, 0);
else
dfs(cnt, sum - l[j], j+1);
vis[j] = 1;
}
}
}
int main()
{
scanf("%d", &n);
while(n--)
{
memset(l, 0, sizeof(l));
memset(vis, 0, sizeof(vis));
scanf("%d", &m);
len = 0;
for(int i = 0; i < m; ++i)
{
scanf("%d", &l[i]);
len += l[i];
vis[i] = 1;
}
if(len % 4)
{
printf("no\n");
continue ;
}
len /= 4;
flag = false;
dfs(0, len, 0);
if(flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}