//从大到小进行排序for(int i =0; i < n; i++){for(int j =0; j < n - i -1; j++){if(rec[j]< rec[j +1]){int tem = rec[j];
rec[j]= rec[j +1];
rec[j +1]= tem;}}}//枚举下棒的长度
ok =false;for(int i = rec[0]; i <= sum /2; i++){if(sum % i !=0)continue;//总和 不能被棍的长度整除 不满足 直接continue
L = i;//棒的长度dfs(0,0,0);if(ok){
System.out.println(i);break;}}
import java.util.*;publicclassPOJ_1011{staticint n, sum, L;staticint[] rec =newint[100];publicstaticvoidmain(String[] args){
Scanner sc =newScanner(System.in);while((n = sc.nextInt())!=0){
sum =0;for(int i =0; i < n; i++){
rec[i]= sc.nextInt();
sum += rec[i];}//从大到小进行排序for(int i =0; i < n; i++){for(int j =0; j < n - i -1; j++){if(rec[j]< rec[j +1]){int tem = rec[j];
rec[j]= rec[j +1];
rec[j +1]= tem;}}}//枚举下棒的长度
ok =false;for(int i = rec[0]; i <= sum /2; i++){if(sum % i !=0)continue;//总和 不能被棍的长度整除 不满足 直接continue
L = i;//棒的长度dfs(0,0,0);if(ok){
System.out.println(i);break;}}//上面没有找到结果if(!ok)System.out.println(sum);}}staticboolean[] vis =newboolean[100];//记录该棒是否被访问过staticboolean ok;// cnt是使用了的棒的数量 num是棒的长度和 index是开始搜索的下标,每次从前一根棒的后面进行搜staticvoiddfs(int cnt,int num,int index){if(ok)return;// 找到了结果if(cnt == n){//n个棒都使用完了 代表找到了结果
ok =true;return;}if(num ==0){//选一根作为开头。 因为数组是从大到小的排序。 所以开头的必然在前面//选择一根作为头开始int k =0;while(vis[k]) k++;
vis[k]=true;dfs(cnt +1, rec[k], k +1);
vis[k]=false;return;}if(num == L){//已经满足一根棒 进行下一根棒的搜索dfs(cnt,0,0);return;}for(int i = index; i < n; i++){if(!vis[i]&& num + rec[i]<= L){//剪枝 必须加上这个 不然超时 因为上一根棒如果和当前棒是一样长,但是上一个棒没有使用,那么这根棒也不需要使用if(!vis[i -1]&& rec[i-1]== rec[i])continue;
vis[i]=true;dfs(cnt +1, num + rec[i], i +1);
vis[i]=false;}}}staticintmax(int a,int b){return a > b ? a : b;}}