protected override bool TryFulfill(IEnumerable <SolverDemand> demands) { var(essential, recommended) = Bucketize(demands); // Quickly reject impossible sets of demands if (essential.Any(demand => !demand.Candidates.Any(candidate => candidate.IsSuitable))) { return(false); } var selectionsSnapshot = Selections.Clone(); // Create snapshot foreach (var permutation in essential.Permutate()) { if (permutation.All(TryFulfill)) { recommended.ForEach(x => TryFulfill(x)); return(true); } else { Selections = selectionsSnapshot.Clone(); // Revert to snapshot } } return(false); }