diff --git a/Luogu/P1120/P1120.cpp b/Luogu/P1120/P1120.cpp new file mode 100644 index 00000000..b4fb0f42 --- /dev/null +++ b/Luogu/P1120/P1120.cpp @@ -0,0 +1,76 @@ +#include +#include +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const int N = 70; + +int n, m, l, a[N], next[N]; +bool vis[N]{false, true}; + +void dfs(int now, int last, int rest) { + if (!rest) { + if (now == m) { + cout << l << endl; + + exit(0); + } + + for (int i = 1; i <= n; i++) { + if (!vis[i]) { + vis[i] = true; + dfs(now + 1, i, l - a[i]); + vis[i] = false; + + break; + } + } + } + + int p = std::lower_bound(a + last + 1, a + n + 1, rest, std::greater()) - a; + + for (int i = p; i <= n; i++) { + if (!vis[i]) { + vis[i] = true; + dfs(now, i, rest - a[i]); + vis[i] = false; + + if (rest == a[i] || rest == l) return; + i = next[i]; + } + } +} + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> n; + + for (int i = 1; i <= n; i++) { + cin >> a[i]; + } + + int sum = std::accumulate(a + 1, a + 1 + n, 0); + + std::sort(a + 1, a + 1 + n, std::greater()); + + for (int i = n; i; i--) { + next[i] = a[i] == a[i + 1] ? next[i + 1] : i; + } + + for (l = a[1]; l <= sum / 2; l++) { + if (sum % l) continue; + + m = sum / l; + dfs(1, 1, l - a[1]); + } + + cout << sum << endl; + + return 0; +}