思路:深搜就可以了。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
int n , length[70];
int used[70];
int len;
int inf = 0x3f3f3f3f;
int min , maxn;
int t;
bool flag;
bool cmp(const int a, const int b){
return a > b;
}
void dfs(int i , int l , int tot){
if(flag) return ;
//printf("i = %d , l = %d , tot = %d\n" , i , l , tot);
if(l == 0){
tot -= len;
if(tot == 0){
flag = true;
printf("%d\n" ,len);
return;
}
else if(tot < 0){
return;
}
else{
for(i = 0 ; used[i] ; ++i);
used[i] = 1;
dfs(i + 1 , len - length[i] , tot);
used[i] = 0;
}
}
else{
for(int j = i ; j < n ; j++){
//printf("j - 1 = %d\n" , j - 1);
if(length[j] == length[j - 1] && !used[j - 1]) continue;
if(!used[j] && l >= length[j]) {
used[j] = 1;
dfs(j , l - length[j] , tot);
used[j] = 0;
}
}
}
return ;
}
int main(){
while(~scanf("%d" , &n) && n != 0){
maxn = -inf;
t = 0;
flag = false;
memset(used , 0 , sizeof(used));
for(int i = 0 ; i < n ; i ++){
scanf("%d" , &length[i]);
if(maxn < length[i]){
maxn = length[i];
}
t += length[i];
}
sort(length , length + n , cmp);
for(len = length[0] ; len <= t / 2 ; ++len) {
if(flag) break;
if(t % len == 0){
flag = false;
dfs(0 , len , t);
}
}
if(!flag)
printf("%d\n" , t);
}
return 0;
}