#include <iostream>
#include <cmath>
#include <algorithm>
#define int long long
using namespace std;
const int MAXX = 1e3 + 11;
int a[MAXX];
bool vis[MAXX];
int flag;
int n, sum, ans;
void dfs(int step, int x, int k) { // step:长度 x:想要的长度 K:第几根
if (flag) {
return ;
}
if (x == 0) {
if (step == sum / ans) { // 凑够了
flag = 1;
return ;
}
for (int i = 1; i <= n; i ++) {
if (!vis[i]) { // 从第一个没用的木棍开始
dfs(step + 1, ans, i);
break;
}
}
}
if (k > n) {
return ;
}
for (int i = k; i <= n; i ++) { // 从后面的开始
if (!vis[i] and a[i] <= x) { // 可以用且比需要的长度短
vis[i] = 1;
dfs(step, x - a[i], i + 1);
vis[i] = 0;
if (ans == x) {
break;
}
while (i < n and a[i] == a[i + 1]) {
i ++;
}
}
}
return ;
}
signed main() {
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
if (a[i] > 50) {
a[i] = 0;// 防毒瘤
}
sum += a[i];
}
sort (a + 1, a + 1 + n, greater<int>());
while (a[n] == 0) {
n --;
}
for (int i = a[1]; i <= sum; i ++) {
if (sum % i == 0) {
ans = i;
dfs(1, i, 1);
if (flag) {
cout << ans;
return 0;
}
}
}
return 0;
}
剩下全 T,还差啥剪枝啊,想不出来了,玄 2 关