Сначала несколько определений:
- Учитывая
n
иk
, рассмотрим отсортированный список мультимножеств , где для каждого мультимножества мы выбираемk
числа{0, 1, ..., n-1}
с повторениями.
Например, для n=5
и k=3
мы имеем:
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 1), ( 0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 2, 2), (0, 2, 3), (0, 2, 4), (0, 3, 3), (0, 3, 4), (0, 4, 4), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 3, 3), (1, 3, 4), (1, 4, 4) , (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 3), (2, 3, 4), (2, 4, 4), ( 3, 3, 3), (3, 3, 4), (3, 4, 4), (4, 4, 4)]
- Часть представляет собой список мультимножеств с тем свойством , что размер пересечения всех мультимножеств в части, по меньшей мере
k-1
. То есть мы берем все мультимножества и пересекаем их (используя пересечение мультимножеств) одновременно. В качестве примеров,[(1, 2, 2), (1, 2, 3), (1, 2, 4)]
является частью, поскольку ее пересечение имеет размер 2, но[(1, 1, 3),(1, 2, 3),(1, 2, 4)]
это не так, потому что его пересечение имеет размер 1.
задача
Ваш код должен принимать два аргумента n
и k
. Затем он должен жадно пройти через эти мультимножества в отсортированном порядке и вывести части списка. Для случая n=5, k=3
правильное разбиение:
(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4)
(0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4)
(0, 2, 2), (0, 2, 3), (0, 2, 4)
(0, 3, 3), (0, 3, 4)
(0, 4, 4)
(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4)
(1, 2, 2), (1, 2, 3), (1, 2, 4)
(1, 3, 3), (1, 3, 4)
(1, 4, 4)
(2, 2, 2), (2, 2, 3), (2, 2, 4)
(2, 3, 3), (2, 3, 4)
(2, 4, 4)
(3, 3, 3), (3, 3, 4)
(3, 4, 4), (4, 4, 4)
Вот еще один пример для n = 4, k = 4
.
(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3)
(0, 0, 1, 1), (0, 0, 1, 2), (0, 0, 1, 3)
(0, 0, 2, 2), (0, 0, 2, 3)
(0, 0, 3, 3)
(0, 1, 1, 1), (0, 1, 1, 2), (0, 1, 1, 3)
(0, 1, 2, 2), (0, 1, 2, 3)
(0, 1, 3, 3)
(0, 2, 2, 2), (0, 2, 2, 3)
(0, 2, 3, 3), (0, 3, 3, 3)
(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3)
(1, 1, 2, 2), (1, 1, 2, 3)
(1, 1, 3, 3)
(1, 2, 2, 2), (1, 2, 2, 3)
(1, 2, 3, 3), (1, 3, 3, 3)
(2, 2, 2, 2), (2, 2, 2, 3)
(2, 2, 3, 3), (2, 3, 3, 3)
(3, 3, 3, 3)
Разъяснение того, что означает жадность: для каждого мультимножества, в свою очередь, мы смотрим, можно ли добавить его к существующей части. Если это возможно, мы можем добавить это. Если это невозможно, мы начинаем новую часть. Мы рассмотрим мультимножества в отсортированном порядке, как в примере, приведенном выше.
Вывод
Вы можете вывести разделение в любом удобном для вас формате. Однако мультимножества должны быть написаны горизонтально в одну строку. То есть отдельный мультимножество не должно быть написано вертикально или разбито на несколько строк. Вы можете выбрать способ разделения представления деталей на выходе.
Предположения
Мы можем предположить это n >= k > 0
.
(0, 4, 4)
само по себе? Учитывая ваше описание, я думаю, что его "часть" будет (0, 4, 4), (1, 4, 4), (2, 4, 4), (3, 4, 4), (4, 4, 4)
. Аналогично для (0, 0, 3, 3)
второго контрольного примера.