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
思路:题目意思是要用上所有stick。简单DFS+剪枝。
剪枝:去掉总stick长度不被4整除的情况;
去掉最大stick长度大于正方形边长的情况。
#include
#include
#include
using namespace std;
int N,arr[22],vis[22],sum,ave;
int t;
bool cmp(int a, int b)
{
return a>b;
}
int ans(int cou,int sumnum, int x)
{
if(cou==4)
return 1;
for(int i = x; i < N;i++)
{
if(!vis[i]&&sumnum+arr[i]<=ave)
{
vis[i]=1;
if(sumnum+arr[i]==ave)
{
if(ans(cou+1,0,0))
return 1;
}
else if(ans(cou,sumnum+arr[i],i+1))
return 1;
vis[i]=0;
}
}
return 0;
}
int main()
{
int i;
cin>>t;
while(t--)
{
sum=0;
memset(vis,0,sizeof(vis));
cin>>N;
for(i = 0; i < N; i++)
{
cin>>arr[i];
sum+=arr[i];
}
ave=sum/4;
sort(arr,arr+N,cmp);
if(sum%4||arr[N-1]>ave)
{
cout<<"no"<