题意:给定各个长度,问能否组成正方形。
DFS:现在看来重要的是思想,像一个问题要分步去思考。
1:正方形边长大于4,总长除以4余数0
2:最大边长不能大于总长除以4
3:查找边长需要从大向小查找,需要排序,且查找到3个满足边长就成功。
//
#include<iostream>
#include<algorithm>
using namespace std;
int stick[25],vist[25];
int n,side;
bool cmp(const int a,const int b)
{
return a > b;
}
int DFS(int num,int len,int s)
{
if(num == 3)
return true;
for(int i = s;i < n; i++){
if(vist[i] == true)
continue;
vist[i] = true;
if(stick[i] + len < side){
if(DFS(num,len + stick[i],i))
return true;
}
else if(stick[i] + len == side){
if(DFS(num+1,0,0))
return true;
}
vist[i] = false;
}
return false;
}
int main()
{
int time;
cin>>time;
while(time--){
int sum = 0;
cin>>n;
for(int i = 0;i < n; i++){
cin>>stick[i];
vist[i] = false;
sum += stick[i];
}
if(n < 4 || sum %4 != 0){
cout<<"no"<<endl;
continue;
}
sort(stick,stick + n,cmp);
side = sum/4;
if(side < stick[0]){
cout<<"no"<<endl;
continue;
}
if(DFS(0,0,0)){
cout<<"yes"<<endl;
}
else cout<<"no"<<endl;
}
return 0;
}