参考原po : http://blog.youkuaiyun.com/lyy289065406/article/details/6647960
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
#include<fstream>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<math.h>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =21252;
const int mod = 10007;
int n,m;
int ssum,st;
int vec[64];
bool visit[64];
bool dfs(int di,int sum,int lastp,int num){
if(num==n)
return true;
int unfit=0;
FORE(i,lastp-1,0){
if(visit[i]||vec[i]==unfit)continue;
visit[i]=1;
if(vec[i]+sum<di){
if(dfs(di,sum+vec[i],i,num+1)){
return true;
}
}
else if(vec[i]+sum==di){
unfit=0;
if(dfs(di,0,n,num+1))//vec[i]灵活度最低,留给其他棍子灵活度最高也失败,剩下方案也失败
return true;
/*else{
visit[i]=0;
return false;
}*/
}
unfit = vec[i];
visit[i]=0;
if(sum==0)break;
}
return false;
}
int cmp(const void* a,const void* b){
return *(int*)a-*(int*)b;
}
//
int main()
{
#ifdef _DEBUG_
fstream fin("G:/1.txt");
#else
#define fin cin
#endif
for(;;){
fin>>n;
if(!n)break;
ssum=st=0;
ms(vec);
ms(visit);
FOR(i,0,n-1){
fin>>vec[i];
ssum+=vec[i];
}
qsort(vec,n,sizeof(int),cmp);
int flag=0;
for(int i=vec[n-1];i<=ssum-i;i++){
if(ssum%i==0){
if(i>=st&&dfs(i,0,n,0)){
printf("%d\n",i);
flag=1;
break;
}
}
}
if(!flag)
printf("%d\n",ssum);
}
return 0;
}