Если вам не надо чтобы каждый человек одинаково часто работал с каждым другим, то подойдет обощение решения, предложенного в комментариях
Alexandroppolus и
Сергей Сергей.
Допустим количество работ (N) и количество людей (M) взаимно просты.
Тогда сгенерируйте M строчек беря людей подряд:
1, 2, 3
4, 5, 1
2, 3, 4
5, 1, 2
3, 4, 5
Тут каждый человек одинаковое количество раз (по одному разу) будет на каждой работе. И дни, когда он будет работать будут максимально равномерно распределены (минимальное расстояние и максимальное между соседними работами будут различаться максимум на 1 и равны floor(N/M) и ceil(N/M)). Это идеальное с точки зрения равенства расписание. Но у него минус - частоты пар работников будут не одинаковыми. 1 гораздо чаще будет работать с 2 и 5, чем с 3 и 4.
Теперь, если N и M не взяимно просты. Пусть D = GCD(N,M) - наибольший общий делитель.
Разбейте всех людей на D групп по N'=N/D человек. N' и M взяимно просты, поэтому можно применить алгоритм выше к каждой группе.
Дальше эти D расписаний надо перемешать. Для максимальной равномерности - сначала взять все первые строки всех расписаний, потом все вторые, и т.д.
На i-ом месте будет день i / N' из расписания i % N' (если индексация с 0).
Так, например, решение для 2 работ и 6 людей:
N' = 3. 2 группы.
В первой:
1 2
3 1
2 3
Во второй:
4 5
6 4
5 6
В итоге:
1 2
4 5
3 1
6 4
2 3
5 6