Square
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5771 Accepted Submission(s): 1836
#include <iostream>
#include <algorithm>
using namespace std;
int n,s,k,a[22],visit[22]={0};
void DFS(int sum,int x,int d)
{
if(k||x==3) //匹配好了三个边就行了,用k标记,并剪枝
{
k=1;return;
}
int i;
for(i=d;i<n;i++) //从d开始,起到剪枝作用,同时避免1-2-3和1-3-2这种重复
{
if(k)return; //把k插入,剪枝
if(!visit[i])
if(sum+a[i]==s) //加上这个长度后正好是一个边
{
visit[i]=1;
DFS(0,x+1,0);
visit[i]=0;
}
else if(sum+a[i]<s) //加上这个长度后还不够形成一个边
{
visit[i]=1;
DFS(sum+a[i],x,i+1);
visit[i]=0;
}
}
}
bool cmp(int a,int b)
{
return a<b;
}
int main(void)
{
int m,i;
cin>>m;
while(m--&&cin>>n)
{
for(i=s=0;i<n;i++)
cin>>a[i],s+=a[i];
sort(a,a+n,cmp);
if(s%4==0)
{
s/=4;
k=0;
DFS(0,0,0); //里面的三个0分别是指当前合成的长度,当前已配好的边数,当前询问到的地点
if(k)cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
else cout<<"no"<<endl;
}
return 0;
}
废话就不说了呢,这都还不会深搜那OrzOrz Orz Orz Orz OrzOrz Orz Orz Orz Orz