Лучшее возможное подмножество
суть проблемы в том что дан массив из n чисел, и нужно разделить его на k подмножеств так чтобы минимальное число из сум элементов каждого из этих k подмножеств было максимально возможным
#include <iostream>
#include <algorithm>
using namespace std;
int a[100005];
int main() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i] += a[i - 1];
}
if (k == 1) {
cout << a[n];
return 0;
}
int mx = 0;
for (int i = 1; i <= n; i++) {
if (mx <= min(a[i], a[n] - a[i])) {
mx = min(a[i], a[n] - a[i]);
}
}
cout << mx;
return 0;
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Это т.н. "задача о куче камней", по сути требуется разложить множество на подмножества как можно более близкого размера.
Жадный алгоритм лучшего решения не гарантирует, а динамическое программирование поможет только в случае k=2.
Эта оптимизационная задача решается полным перебором, а для ускорения можно привлечь метод ветвей и границ и, вероятно, др. методы комбинаторной оптимизации.
Что почитать - Романовский "Алгоритмы решения экстремальных задач"