dfs
题意:给一堆不同长度的棒,问是否可以组成正方形,所有的棒都要用上
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n,m,sum;
int a[25];
bool book[25],f,ff;
void dfs(int b,int l,int k) { //l表示在第b条边目前积累的长度,k表示在第b条边目前进行排查到的棒的标号
if (b==5) {
ff=true;
return;
}
if (l==sum) {
dfs(b+1,0,0);
if (ff==true) return;
}
for (int i=k;i<m;i++) {
if (book[i]==false && l+a[i]<=sum) {
book[i]=true;
dfs(b,a[i]+l,i+1);
if (ff==true) return;
book[i]=false;
}
}
}
int main()
{
scanf ("%d",&n);
while (n--) {
scanf ("%d",&m);
sum=0;
f=false;
ff=false;
memset(book,false,sizeof(book));
for (int i=0;i<m;i++) {
scanf ("%d",&a[i]);
sum+=a[i];
}
if (sum%4!=0) { //剪枝
printf ("no\n");
continue;
}
sum/=4;
for (int i=0;i<m;i++) { //剪枝
if (a[i]>sum) {
f=true;
break;
}
}
if (f==true) {
printf ("no\n");
continue;
}
dfs(1,0,0);
if (ff==true) printf ("yes\n");
else printf ("no\n");
}
return 0;
}