HDU 1518 DFS

Square

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11432    Accepted Submission(s): 3671


Problem 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
 
 
 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int s[10003]={0};
bool mark[10003]={0};
int m=0;
bool dfs(int len,int l,int count,int pos);
bool cmp(int x,int y)
{
 return x>y;
}
int main()
{
 int T=0;
 scanf("%d",&T);
 while(T--)
 {
  int sum=0;
  scanf("%d",&m);
  for(int i=0;i<m;i++)
  {
   scanf("%d",&s[i]);
   sum+=s[i];
   mark[i]=0;
  }
  if(sum%4||m<4)
  {
   printf("no\n");
   continue;
      }
  sum/=4;
  sort(s,s+m,cmp);
  if(dfs(sum,0,0,0))
  {
   printf("yes\n");
  }
  else
  {
   printf("no\n");
  }
 }
 return 0;
}
bool dfs(int len,int l,int count,int pos)
{
 if(count==4) return 1;
 for(int i=pos;i<m;i++)
 {
  if(mark[i]) continue;
  if(l+s[i]==len)
  {
   mark[i]=1;
   if(dfs(len,0,count+1,0))
    return 1;
   mark[i]=0;
  }
  else if(l+s[i]<len)
  {
   mark[i]=1;
   if(dfs(len,l+s[i],count,i+1))
    return 1;
   mark[i]=0;
  }
 }
 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章