private static int CalculateMaxHappiness(List <Relation> relations) { var personNames = relations.Select(r => r.Name).Distinct().ToList(); var persons = personNames.Select(name => { var personRelations = relations.Where(r => r.Name == name); var happiness = personRelations.ToDictionary(x => personNames.IndexOf(x.Neighbor), x => x.Happiness); return(happiness); }) .ToList(); var N = persons.Count(); var maxHappiness = 0; foreach (var perm in MathHelper.AllPermutations(N)) { var happiness = 0; var order = perm.ToArray(); for (var i = 0; i < N; i++) { var i1 = order[i]; var i2 = order[(i + 1 + N) % N]; var p1 = persons[i1]; var p2 = persons[i2]; happiness += p1[i2] + p2[i1]; } if (happiness > maxHappiness) { maxHappiness = happiness; } } return(maxHappiness); }