17.18点WA,其他点AC
#include <bits/stdc++.h>
using namespace std;
#define maxn 70
int n,need,sum,Size;
int a[maxn],nxt[maxn];
bool used[maxn];
bool found;
void dfs(int now,int lastuse,int w){
int x;
if(w==0){
if(now==need){found=1;return;}
for(x=1;x<=n;x++)
if(!used[x]) break;
used[x]=1;
dfs(now+1,x,Size-a[x]);
used[x]=0;
if(found) return;
}
int l=lastuse+1,r=n,mid;
while(l<r){
mid=(l+r)>>1;
if(a[mid]<=w) r=mid;
else l=mid+1;
}
for(x=l;x<=n;x++){
if(!used[x]){
used[x]=1;
dfs(now,x,w-a[x]);
used[x]=0;
if(found) return;
if(w==a[x]||w==Size) return;
x=nxt[x];
if(x==n) return;
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a+1,a+n+1,greater_equal<int>());
nxt[n]=n;
for(int i=n-1;i>0;i--){
if(a[i]==a[i+1]) nxt[i]=nxt[i+1];
else nxt[i]=i;
}
used[1]=1;
for(Size=a[1];Size<=(sum>>1);Size++){
if(Size==0||sum%Size!=0) continue;
need=sum/Size;
found=0;
dfs(1,1,Size-a[1]);
if(found){printf("%d\n",Size);return 0;}
}
printf("%d\n",sum); return 0;
}