测试网站:http://poj.org/problem?id=2362
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 27809 | Accepted: 9356 |
Description
Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
Input
The first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.
Output
For each case, output a line containing "yes" if is is possible to form a square; otherwise output "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
AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int m,a[23],v[23],edge;
bool cmp(int x,int y)
{
return x>y;
}
bool dfs(int n,int l,int j)
{
if(n==3)return true;//剪枝
int i;
for(i=j+1;i<m;++i)
{
if(!v[i]&&l+a[i]<=edge)//没取出过且不超值
{
v[i]=1;
int k;
if(l+a[i]==edge)k=dfs(n+1,0,0);
else k=dfs(n,l+a[i],i);
if(k)return true;//此处的return true不能漏了
v[i]=0;
}
}
return false;//遍历完所以情况都不满足,只能return false;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int i,j,length=0,k=0;
cin>>m;
for(i=0;i<m;++i)
{
cin>>a[i];
length+=a[i];
}
memset(v,0,sizeof(v));
if(length%4==0)
{
k=1;
edge=length/4;
sort(a,a+m,cmp);
}
if(k&&dfs(0,0,0))cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
}