ich auf Spiel mit Zahlungssystem, mit folgenden Anforderungen arbeite:Finden Sie die optimale Kombination Rechnungen für einen bestimmten Wert zu zahlen
1- die Geldscheine im Spiel Angenommen sind: 10,5,4,3, 2,1
2-AI muss die geringste Anzahl von Rechnungen wählen, die benötigt wird, um den genauen Betrag abzudecken, dh wenn der zu zahlende Betrag 8 ist und AI (4,4,3,3,2) ... Er kann wählen (4,4) aber nicht (3,3,2)
3- Falls AI die genaue Menge nicht mit den Rechnungen, die er hat, eingeben kann, sollte er die Kombination so wählen, dass sie den Betrag angibt mit dem geringsten Differenzwert, dh wenn das erforderlich ist Betrag zu zahlen ist 7 und die KI hat die folgenden Rechnungen (10,5,4,4), er wählt (4,4) was dem Spieler 1 mehr über den benötigten Betrag gibt.
Unten ist mein Code
//sortedValues is a list containing my bills in descending order
//ChosenCardsToPay is a list for the bills I choose to pay with
public void PreparePayment(int neededAmount)
{
int remainingAmount = neededAmount;
int chosenAmount;
while (remainingAmount > 0)
{
chosenAmount = 0;
foreach (int moneyValue in sortedValues)
{
if (moneyValue <= remainingAmount)
{ chosenCardsToPay.Add (moneyValue); //Add Bill Value to my candidate list
remainingAmount = remainingAmount - moneyValue;
chosenAmount = moneyValue;
break;
}
}
if (chosenAmount != 0)
sortedValues.Remove (moneyValue);//Remove Chosen Bill from Initial List
else //If all bill values are greater than remaining amount, i choose the bill with smallest value and add to the candidate list
{
chosenAmount = sortedValues.Last();
sortedValues.Remove(chosenAmount);
chosenCardsToPay.Add (chosenAmount);
remainingAmount = remainingAmount - moneyValue;
}
}
}
Es funktioniert gut, die meisten der Zeit, aber diesen Fall nehmen: Erforderliche Menge ist 4 und AI hat (3,2,2) als Rechnungen. Unter Verwendung des obigen Algorithmus wählt AI (3,2), wo die optimale Antwort (2,2) ist.
Darf mich jemand auf der rechten Seite über dieses Problem nachdenken? Vielen Dank!
Must * dest Wertdifferenz * immer * positiv * oder es kann entweder positiv oder negativ sein? Z.B. "[5, 4, 3]" wenn "10" bezahlt werden soll. Was ist die richtige Antwort - "12" ('5 + 4 + 3') oder' 9' ('5 + 4')? –
Dieses Problem ist NP-vollständig, da es eine Form des Subset-Sum-Problems ist. Das bedeutet, dass Sie im Allgemeinen eine exponentielle Zeit benötigen. Da Ihr Code keine Rekursions- oder Exponentialzeitanteile hat, kann er das Problem im Allgemeinen nicht lösen. Ihr Code ist eine Heuristik/Approximation basierend auf dem Greedy-Ansatz. – sascha
Sie verwenden einen Greedy-Algorithmus, der hier nicht geeignet ist. Berücksichtigen Sie dynamische Programmierung Ansatz für ähnliche Probleme (Teilmenge Summe, Münzwechsel) – MBo