Tout d'abord, quelques définitions:
- Étant donné
n
etk
, considérons la liste triée de multisets , où pour chaque multiset nous choisissons desk
nombres{0, 1, ..., n-1}
avec des répétitions.
Par exemple, pour n=5
et k=3
, nous avons:
[(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)]
- Une pièce est une liste de multisets avec la propriété que la taille de l'intersection de tous les multisets de la pièce est au moins
k-1
. C'est-à-dire que nous prenons tous les multisets et les croisons (en utilisant l'intersection multiset) en une seule fois. Par exemple,[(1, 2, 2), (1, 2, 3), (1, 2, 4)]
est une pièce car son intersection est de taille 2, mais[(1, 1, 3),(1, 2, 3),(1, 2, 4)]
ne l'est pas, car son intersection est de taille 1.
Tâche
Votre code doit prendre deux arguments n
et k
. Il doit ensuite parcourir goulûment ces multisets dans un ordre trié et sortir les parties de la liste. Pour le cas n=5, k=3
, le partitionnement correct est:
(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)
Voici un autre exemple pour 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)
Clarification de ce que signifie gourmand: Pour chaque multiset tour à tour nous cherchons à voir s'il peut être ajouté à la partie existante. Si c'est le cas, nous l'ajouterons. Si ce n'est pas possible, nous commençons une nouvelle partie. Nous regardons les multisets dans l'ordre trié comme dans l'exemple donné ci-dessus.
Production
Vous pouvez sortir le partitionnement dans n'importe quel format sensible que vous aimez. Cependant, les multisets doivent être écrits horizontalement sur une seule ligne. C'est-à-dire qu'un multiset individuel ne doit pas être écrit verticalement ou réparti sur plusieurs lignes. Vous pouvez choisir la façon dont vous séparez la représentation des pièces dans la sortie.
Hypothèses
Nous pouvons supposer cela n >= k > 0
.
(0, 4, 4)
seul? Compte tenu de votre description, je pense que sa "partie" serait (0, 4, 4), (1, 4, 4), (2, 4, 4), (3, 4, 4), (4, 4, 4)
. De même pour (0, 0, 3, 3)
le deuxième cas de test.