HDU4277 搜索剪枝

这... 练练搜索吧... 自己写的哈希都不行.. 悲催悲催...

/********************
HDU 4277
Sevenster
2012.09.12
********************/
#include<iostream>
#include<algorithm>
#include<set>
#include<cmath>
#define HashSize (1<<15)-1;
using namespace std;

int T,N,ans,sum;
int E[16];
__int64 hash[1<<15];
set<__int64>se;

bool judge( int a,int b,int c )
{
 	 if( a+b>c&&abs(a-b)<c )
 	 	 return true;
 	 return false;
}

void swap( int &a,int &b )
{
 	 a^=b;b^=a;a^=b;
}

bool Hash( int a,int b,int c )
{
 	 if( a<b ) swap(a,b);
 	 if( b<c ) swap(b,c);
 	 if( a<b ) swap(a,b);
 	 __int64 ploy=a+b*sum+c*sum*sum;
 	 if( se.find(ploy)==se.end() )
 	 {	 
   	 	 se.insert(ploy);
 	 	 return true;
	 }
	 return false;
 	 /**
 	 int val=ploy%HashSize;
 	 while( hash[val]!=-1||hash[val]!=ploy )
 	 		val=(val<<1|1)%HashSize;
 	 if( hash[val]==-1 )
 	 {
 	 	 hash[val]=ploy;
 	 	 return true;
	 }*/
}

void dfs( int a,int b,int c,int d )
{
	 if( judge(a,b,c)&&Hash(a,b,c) )
  	 	 ans++;
 	 if( d>N )
	  	 return ;
 	 if( c-E[d]+b>a+E[d] )
 	 	 dfs( a+E[d],b,c-E[d],d+1 );
	 if( c-E[d]+a>b+E[d] )
 	 	 dfs( a,b+E[d],c-E[d],d+1 );
  	 dfs( a,b,c,d+1 );
}
 	
int main()
{
 	scanf( "%d",&T );
 	while( T-- )
 	{
	 	   ans=0;
	 	   se.clear();
	 	   memset( hash,-1,sizeof(hash) );
	 	   scanf( "%d",&N );
	 	   sum=0;
	 	   for( int i=1;i<=N;i++ )
	 	   {
	 	   		scanf( "%d",&E[i] );
	 	   		sum+=E[i];
		   }
	 	   dfs( E[1],0,sum-E[1],2 );
	 	   printf( "%d\n",ans );
  	}
 	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值