【题目概括】
现在有\(n\)个长度不超过\(50\)的木棍,请你把这些小木棍拼成若干根长度相同的木棍。
请你最小化拼成后的长度。
【思路要点】
【代码】
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define FI first
#define SE second
#define REP(i, s, t) for (int i = s; i <= t; i++)
#define PER(i, s, t) for (int i = s; i >= t; i--)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef long double ld;
template <class T> void chkmax(T& x, T y) { x = max(x, y); }
template <class T> void chkmin(T& x, T y) { x = min(x, y); }
namespace input {
template <class T>
void read(T& x) {
x = 0; char ch = 0; int f = 1;
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
x *= f;
}
void re(int& x) { read(x); }
void re(ll& x) { read(x); }
void re(ull& x) { read(x); }
void re(char& x) { x = getchar(); }
void re(string& x) { cin >> x; }
}
using namespace input;
namespace output {
template <class T>
void write(T x) {
if (!x) { putchar('0'); return; }
if (x < 0) putchar('-'), x = -x;
static int top, stk[25]; top = 0;
while (x) stk[++top] = x % 10, x /= 10;
while (top) putchar(stk[top--] + 48);
}
void pr(int x) { write(x); }
void pr(ll x) { write(x); }
void pr(ull x) { write(x); }
void pr(char x) { putchar(x); }
void pr(string x) { cout << x; }
void pp() { putchar(' '); }
void ps() { puts(""); }
}
using namespace output;
const int N = 105;
int n, mx, mi, sum, need;
int a[N], buk[N];
bool flg = 0;
void dfs(int rest, int nowLen, int lastChose) {
if (!rest) {
pr(need), pr('\n');
flg = 1;
return;
}
if (nowLen == need) {
dfs(rest - 1, 0, mx);
return;
}
for (int i = lastChose; i >= mi; i--) {
if (flg)
return;
if (buk[i] && nowLen + i <= need) {
buk[i]--;
dfs(rest, nowLen + i, i);
buk[i]++;
if (!nowLen || nowLen + i == need)
break;
}
}
}
void solve() {
memset(buk, 0, sizeof buk);
sum = mx = 0; flg = 0; mi = inf;
for (int i = 1, x; i <= n; i++) {
re(x), sum += x, buk[x]++, chkmax(mx, x), chkmin(mi, x);
}
for (int i = mx; i <= sum / 2; i++)
if (sum % i == 0) {
need = i;
dfs(sum / i, 0, mx);
if (flg)
break;
}
if (!flg)
pr(sum), pr('\n');
}
int main() {
while (1) {
re(n);
if (!n)
return 0;
solve();
}
return 0;
}