不能过于偏向于队友,应该相信自己的判断。这么简单的搜索题目竟然被搞的如此2B。。。
3^15的搜索剪剪枝可以想想,4^15的就不用思考了。。。
直接枚举放在哪个上面,并且a<=b<=c , 一个判断即可。set除掉重复
#include <iostream>
#include <stdio.h>
#include <set>
using namespace std;
int a[20],z[20],n,sum[3],ans, SUM;
#define LL __int64
struct DS{
int a,b,c;
bool operator < (const DS & A) const{
if (a!=A.a) return a<A.a;
if (b!=A.b) return b<A.b;
return c<A.c;
}
DS(){}
DS(int x,int y,int z):a(x),b(y),c(z){}
};
set<DS> zhu;
void dfs(int x){
if (x == n){
if (sum[0]>sum[1] || sum[1]>sum[2]) return;
if (sum[0] + sum[1] > sum[2] && abs(sum[1]-sum[2])<sum[0]){
zhu.insert(DS(sum[0],sum[1],sum[2]));
}
return;
}
for (z[x] = 0 ; z[x] < 3 ; ++z[x]){
sum[ z[x] ] += a[x];
if (sum[ z[x] ] * 2 >= SUM);
else{
dfs(x + 1);
}
sum[ z[x] ] -= a[x];
}
}
void solve(){
zhu.clear();
scanf("%d",&n);
SUM = 0;
for (int i=0;i<n;++i){
scanf("%d",&a[i]);
SUM += a[i];
}
for (int i = 0 ; i < n ; ++ i)
for (int j = i + 1 ; j < n ; ++ j)
if (a[i] < a[j])
swap(a[i] , a[j]);
memset(sum,0,sizeof(sum));
dfs(0);
printf("%d\n",zhu.size());
}
int main(){
int _;
cin >> _;
while( _-- ) solve();
}