经典剪枝爆搜,没什么好说的。
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int num[500010], maxn, minn, sum;
void dfs(int wait, int already, int need, int can) {
int i;
if (wait == 1) {
printf("%d", need);
exit(0);
}
if (already == need) {
dfs(wait - 1, 0, need, maxn);
return;
}
for (int i = can; i >= 0; i--) {
if (num[i] && (i + already <= need)) {
num[i]--;
dfs(wait, already + i, need, i);
num[i]++;
if (already == 0 || already + i == need)
return;
}
}
}
int main() {
int i, j, k, m, n, temp;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
scanf("%d", &k);
if (k <= 50) {
sum += k;
num[k]++;
minn = min(k, minn);
maxn = max(k, maxn);
}
}
for (i = maxn; i <= sum / 2; i++)
if (sum % i == 0)
dfs(sum / i, 0, i, maxn);
printf("%d", sum);
return 0;
}