1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include <bits/stdc++.h> using namespace std; const int maxn = 70; bool vis[maxn]; int n, C, L, a[maxn];
bool dfs(int cnt, int len, int lst) { if (cnt > C) return true; if (len == L) return dfs(cnt + 1, 0, 1); int fail = 0; for (int i = lst; i <= n; ++i) { if (!vis[i] && len + a[i] <= L && a[i] != fail) { vis[i] = 1; if (dfs(cnt, len + a[i], i + 1)) return true; vis[i] = 0; fail = a[i]; if (len == 0 || len + a[i] == L) return false; } } return false; }
bool cmp(int &a, int &b) { return a > b; }
int main() { while (~scanf("%d", &n) && n) { int sum = 0, mx = 0; for (int i = 1; i <= n; ++i) scanf("%d", &a[i]), sum += a[i], mx = max(mx, a[i]); sort(a + 1, a + 1 + n, cmp); for (L = mx; L <= sum; ++L) { if (sum % L) continue; C = sum / L; memset(vis, 0, sizeof(vis)); if (dfs(1, 0, 1)) { cout << L << endl; break; } } } return 0; }
|