rt,时限的事情详见:https://www.luogu.com.cn/discuss/461880
然后这个蒟蒻很不幸地被卡了/kk:
感觉读入优化的话帮助不大,因为 n 只有 60。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 75;
const int INF = 1e9;
int n;
int a[N];
int val = -INF, sum = 0;
bool vis[N];
bool dfs(int stick, int num, int now, int last, int len) {
if (stick == num) return true;
if (now == len) return dfs(stick + 1, num, 0, 1, len);
int fail = 0;
for (int i = last; i <= n; i++) {
if (vis[i] || fail == a[i] || now + a[i] > len) continue;
//if (now + a[i] > len) break;
fail = a[i], vis[i] = true;
if (dfs(stick, num, now + a[i], i + 1, len)) return true;
vis[i] = false;
if (now == 0 || now + a[i] == len) return false;
}
return false;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i], val = max(val, a[i]), sum += a[i];
sort(a + 1, a + 1 + n);
reverse(a + 1, a + 1 + n);
int res;
for (int i = val; i <= sum; i++) {
if (sum % i) continue;
memset(vis, 0, sizeof(vis));
if (dfs(1, sum / i, 0, 1, i)) {
cout << i << endl;
return 0;
}
}
return 0;
}