package
0.0.0-20241221191246-b80a13d7bbe0
Repository: https://github.com/yvv4git/go-algorithms.git
Documentation: pkg.go.dev
# README
Задача: Оптимальное распределение задач
Описание задачи
Предположим, у нас есть n
задач, каждая из которых имеет определенную стоимость выполнения c_i
и время выполнения t_i
. Нам нужно распределить эти задачи между k
сотрудниками таким образом, чтобы минимизировать максимальное время, затрачиваемое на выполнение задач одним сотрудником.
Пример входных данных
- Количество задач:
n = 5
- Количество сотрудников:
k = 2
- Стоимость и время выполнения задач:
- Задача 1:
c_1 = 10
,t_1 = 3
- Задача 2:
c_2 = 20
,t_2 = 2
- Задача 3:
c_3 = 30
,t_3 = 4
- Задача 4:
c_4 = 40
,t_4 = 1
- Задача 5:
c_5 = 50
,t_5 = 5
- Задача 1:
Почему используется динамическое программирование?
Данная задача является классической задачей о разбиении множества на подмножества с минимальной разницей в сумме элементов. Динамическое программирование подходит для решения этой задачи, так как позволяет эффективно хранить промежуточные результаты и избежать повторных вычислений.
Решение с использованием динамического программирования
-
Определение состояния:
dp[i][j]
— минимальное время, за которое можно распределить первыеi
задач междуj
сотрудниками.
-
Базовый случай:
dp[0][0] = 0
— если задач нет, то время равно 0.dp[i][0] = ∞
— если сотрудников нет, то распределить задачи невозможно.
-
Рекуррентное соотношение:
- Для каждой задачи
i
и каждого сотрудникаj
мы пытаемся распределить задачи так, чтобы минимизировать максимальное время:dp[i][j] = min(dp[i][j], max(dp[i-1][j-1], t_i))
- Для каждой задачи
-
Заполнение таблицы:
- Проходим по всем задачам и сотрудникам, заполняя таблицу
dp
.
- Проходим по всем задачам и сотрудникам, заполняя таблицу
-
Результат:
- Искомое значение будет находиться в
dp[n][k]
.
- Искомое значение будет находиться в
Пример кода на Python
def optimal_task_distribution(n, k, tasks):
dp = [[float('inf')] * (k + 1) for _ in range(n + 1)]
dp[0][0] = 0
for i in range(1, n + 1):
for j in range(1, k + 1):
max_time = 0
for m in range(i):
max_time = max(max_time, tasks[m][1])
dp[i][j] = min(dp[i][j], max(dp[m][j-1], max_time))
return dp[n][k]
# Пример использования
tasks = [(10, 3), (20, 2), (30, 4), (40, 1), (50, 5)]
n = 5
k = 2
print(optimal_task_distribution(n, k, tasks))