2012 ACM/ICPC Asia Regional Changchun Online USACO ORZ
http://acm.hdu.edu.cn/showproblem.php?pid=4277
思路:暴力;

#include<stdio.h> #include<iostream> #include<set> using namespace std; #define MAXN 16 #define STA 1<<17 int up,a,bc,b,c; int num[MAXN],val[STA]; set<int>Map[150005]; void inite() { int i,pos,temp; for(i=0;i<=up;i++) { temp=i; pos=val[i]=0; while(temp) { if(temp&1) { val[i]+=num[pos]; } temp>>=1; pos++; } } return ; } void fun(int s,int s1,int pos) { int temp; if((1<<pos)>up)return; b=val[s1]; c=val[s^s1]; if(a>=b&&a>=c&&c){ if(b<c)b^=c^=b^=c; Map[a].insert(b); } temp=(1<<pos); while(((s&temp)==0)&&(temp<up)) { ++pos; temp=(1<<pos); } fun(s,s1+(1<<pos),pos+1); fun(s,s1,pos+1); } int main() { int T,N,i,sum,ans; scanf("%d",&T); while(T--) { scanf("%d",&N); up=1<<N;up--; for(sum=i=0;i<N;i++) { scanf("%d",&num[i]); sum+=num[i]; } for(i=1;i<=sum;i++) Map[i].clear(); inite(); for(i=1;i<up;i++) { a=val[i]; bc=val[up^i]; if(bc>a) fun(up^i,0,0); } ans=0; for(i=1;i<=sum;i++) { ans+=Map[i].size(); } printf("%d\n",ans); } return 0; }