J'ai une liste d'éléments qui est un peu comme ceci:Comment diviser une liste d'éléments en partitions égales en fonction du poids de l'objet?
[
["orange", 9],
["watermelon", 3],
["grapefruit", 6],
["peach", 8],
["durian", 2],
["apricot", 6]
]
Je voudrais partager cette liste en ... dire deux groupes pour que la somme des poids des éléments de chaque groupe sont les égale que possible, à savoir:
List 1:
orange: 9
durian: 2
apricot: 6
TOTAL: 17
List 2:
watermelon: 3
grapefruit: 6
peach: 8
TOTAL: 17
Actuellement, je suis résoudre ce en parcourant la liste ordonnée de manière zigzag'esque. Affectation des objets avec plus de poids dans la première passe à chaque groupe, en affectant les objets avec moins de poids sur la deuxième passe, et ainsi de suite.
Cela fonctionne bien, mais il a des défauts. Je pense qu'un second passage sur les groupes dans lesquels j'échangerais des objets se traduirait par des groupes plus équitablement répartis, mais le code impliqué pourrait devenir trop compliqué. Est-ce que quelqu'un sait d'une manière plus efficace ou intelligente de faire ceci?
Merci!
Hey Chris, tout d'abord, merci de me donner le nom de ce problème, le "problème de partition". Et bien sûr, merci pour la réponse à! L'approche gourmande semble utile et elle pourrait donner de meilleurs résultats que ma méthode actuelle.Mais je suppose que je vais opter pour la méthode de la force brute, mon ensemble de données ne génère que 1680 combinaisons, donc je suppose que cela ne fera que tomber dans la catégorie "light data crunching" ... Et je serai en mesure de fournir variation à la solution en choisissant au hasard entre les N solutions supérieures. Merci encore! –