HDU 1518 Square

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518


思路:DFS+剪枝


这题一直想了好久没做出来,最后想到DFS,交了两次都TLE了  (+ . +)|||............


没办法,看别人的解题报告了,也是DFS ,有些地方优化了,终于AC了 ^0^……


#include<iostream>
#include<cstdio>
using namespace std;
#define max(a,b) (a)>(b)?(a):(b)
int a[23],n,sum,aver,maxn;
bool b[23],flag;
void dfs(int mySum,int Count,int j)
{
    if(mySum==aver)
	{
	   Count++;
	   if(Count==4)
	   {
	      flag=true;
		  return;
	   }
	   else mySum=0;
	   j=0;

	}
	if(flag) return;//在此处纠结了,避免不必要的时间损耗,没它时我TLE了
	for(int i=j;i<n;i++)
	{
	   if(!b[i]&&mySum+a[i]<=aver)
	   {
	      b[i]=true;
		  dfs(mySum+a[i],Count,i);
		  b[i]=false;
	   }
	}

}
int main()
{
   int T,i;
   scanf("%d",&T);
   while(T--)
   {
      scanf("%d",&n);
	  sum=maxn=0;
	  for(i=0;i<n;i++)
	  {
	     scanf("%d",&a[i]);
		 sum+=a[i];
		 maxn=max(a[i],maxn);
		 b[i]=false;
	  }
	  if(sum%4!=0||maxn>sum/4)//简单判断、不满足的直接给出结果
	      printf("no\n");
	  else
	  {
	     flag=false;
	     aver=sum/4;
		 dfs(0,0,0);
		 if(flag) printf("yes\n");
		 else printf("no\n");
	  }
   }
   return 0;
}




你可能感兴趣的:(优化,ini)