Description
给出N个木棍,每个都必须用到。问能否用它们组成一个正方形,即四边长度相等。
Input
第一行给出一个数字N,代表有多少组测试数据。接下来N行,每行先给出一个数字M(4<=M<=20),接下来M个数字.每个数字在[1,1000]
Output
输出有N行,每行为"yes"或者"no"
Sample Input
3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5
Sample Output
yes
no
yes
HINT
Source
这题在BJFU上有相同的题,当时随便写了一个就过了,实在是题目太水,没有发现我写的有很大的BUG
比如这组数据就可能出错 14 15 10 17 16 12 1 10 20 17 19 4 5 9 5
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
int used[21];
int data[21];
int complete, n, p, target;
void rer(int deep);
void chuandfs(int cur, int temp, int deep);
void chuandfs(int cur, int temp, int deep) {
if (complete == 1)
return;
// 搜出一条边了
if (temp == target) {
rer(deep + 1);
return;
}
int i;
for (i = cur; i < p; ++i) {
if (used[i] == 0) {
used[i] = 1;
chuandfs(i, temp + data[i], deep);
used[i] = 0;
}
}
}
void rer(int deep) {
if (deep > 2) {
complete = 1;
return;
}
if (complete == 1)
return;
int i;
// 开始寻找下一条边的开始(第一条无论如何都是要用到的)
for (i = 0; i < p; ++i)
if (used[i] == 0)
break;
// 递归
used[i] = 1;
chuandfs(i, data[i], deep);
used[i] = 0;
}
int main() {
int i, sum;
cin >> n;
while (n--) {
cin >> p;
sum = 0;
for (i = 0; i < p; ++i) {
cin >> data[i];
used[i] = 0;
sum += data[i];
}
sort(data, data + p, less<int>());
if (sum % 4 == 0 && data[p - 1] <= sum / 4)
target = sum / 4;
else {
cout << "no" << endl;
continue;
}
complete = 0;
rer(0);
if (complete == 1)
cout << "yes" << endl;
else
cout << "no" << endl;
}
return 0;
}
/**************************************************************
Problem: 1263
User: xrq
Language: C++
Result: Accepted
Time:76 ms
Memory:1536 kb
****************************************************************/