hdu 4277 USACO ORZ

时间:2022-10-06 17:15:03

没什么好方法,只能用dfs了。

代码如下:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#define I(x) scanf("%d",&x)
using namespace std;
int a[],n,ans;
set<pair<int,int> > p;
void dfs(int pos,int sum1,int sum2,int sum3)
{
int i,j,k;
if(pos==n){
if(sum2==||sum3==) return ;
i=min(sum1,sum2);
i=min(i,sum3);
j=max(sum1,sum2);
j=max(j,sum3);
if(p.find(make_pair(i,j))!=p.end()) return ;
if(sum1+sum2>sum3&&abs(sum1-sum2)<sum3){
ans++;
p.insert(make_pair(i,j));
}
return;
}
dfs(pos+,sum1+a[pos],sum2,sum3);
dfs(pos+,sum1,sum2+a[pos],sum3);
dfs(pos+,sum1,sum2,sum3+a[pos]);
}
int main()
{
int t,i;
I(t);
while(t--){
I(n);
p.clear();
for(i=;i<n;i++) I(a[i]);
ans=;
dfs(,a[],,);
printf("%d\n",ans);
}
return ;
}