1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| List<int> ReturnList(List<int> liste, int total)
{
liste.Sort();
liste.Reverse();
var valeurs = liste.ToArray();
if (RetirerValeursJusquAuRésultat(valeurs, 0, total))
{
return ListerValeursRetirées(liste, valeurs).ToList();
}
throw new ArgumentException("Pas de combinaison.");
}
bool RetirerValeursJusquAuRésultat(int[] valeurs, int début, int total)
{
if (total == 0) return true;
for (int i = début; i < valeurs.Length; ++i)
{
var valeur = valeurs[i];
if (valeur > total) continue;
valeurs[i] = 0;
if (RetirerValeursJusquAuRésultat(valeurs, i + 1, total - valeur)) return true;
valeurs[i] = valeur;
}
return false;
}
IEnumerable<int> ListerValeursRetirées(List<int> liste, int[] valeurs)
{
for (int i = 0; i < valeurs.Length; ++i)
{
if (valeurs[i] == 0) yield return liste[i];
}
} |
Partager