Hallo,
das ist doch eine interessante Aufgabe.
Durch den Rabattsprung von 10% auf 20% ergeben sich mehrere Möglichkeiten.
Ich hab da mal was gebastelt
Const BuchPreis As Double = 8.0
ReadOnly Rabatts() As Integer = {0, 0, 5, 10, 20, 25}
Sub Test()
Dim Bücher = {2, 2, 2, 1, 1}
'Dim Bücher = {7, 4, 6, 4, 3}
Dim NormalPreis = Bücher.Sum * BuchPreis
Dim KaufPreis = BestPreis(Bücher)
Dim Rabatt = 1.0 - KaufPreis / NormalPreis
Dim sb As New System.Text.StringBuilder
Dim nl = Environment.NewLine
sb.AppendFormat("Die {1} Bücher kosten zum Normalpreis {2:c}.{0}", nl, _
Bücher.Sum, NormalPreis)
sb.AppendFormat("Günstigster Kaufpreis mit Rabatt: {1:c}{0}", nl, KaufPreis)
sb.AppendFormat("Ersparnis: {1:c} Rabatt: {2:p}{0}", nl, NormalPreis - _
KaufPreis, Rabatt)
Me.TextBox1.Text = sb.ToString
End Sub
''' <summary>
''' Berechnet den besten Preis.
''' </summary>
''' <param name="kauf">Die zu kaufenden Bücher.</param>
''' <returns></returns>
''' <remarks></remarks>
Private Function BestPreis(kauf() As Integer) As Double
If kauf.Length <> 5 Then
Throw New ArgumentException("Das Array hat die falsche Länge!", "kauf")
End If
'------------------------------------------
Dim preisliste As New List(Of Double)
Dim p As Double
'------------------------------------------
' 1. Preistest beginnend mit 5 Buchtiteln
Dim ka = (From x In kauf Where x > 0 Order By x Descending).ToArray
While ka.Any(Function(x) x > 0)
While ka.All(Function(x) x > 0)
p += Preis(ka.Length)
For i = 0 To ka.Length - 1
ka(i) -= 1
Next
End While
ka = (From x In ka Where x > 0 Order By x Descending).ToArray
End While
preisliste.Add(p)
'------------------------------------------
' 2. Preistest beginnend mit 4 Buchtiteln
Dim kav = (From x In kauf Where x > 0 Order By x Descending).ToArray
If kav.Length = 5 Then
Dim erst = True
p = 0
ka = kav.Take(kav.Length - 1).ToArray
While ka.Any(Function(x) x > 0)
While ka.All(Function(x) x > 0)
p += Preis(ka.Length)
For i = 0 To ka.Length - 1
ka(i) -= 1
Next
End While
If erst Then
erst = False
ka = ka.Concat({kav.Last}).ToArray '5. Buchtitel hinzufügen
End If
ka = (From x In ka Where x > 0 Order By x Descending).ToArray
End While
preisliste.Add(p)
End If
Return preisliste.Min
End Function
''' <summary>
''' Berechnet den Preis mit Rabatt.
''' </summary>
''' <param name="anz">Anzahl der Bücher.</param>
''' <returns></returns>
''' <remarks></remarks>
Private Function Preis(anz As Integer) As Double
Dim ges = anz * BuchPreis
Dim rab = ges * Rabatts(anz) / 100
Return ges - rab
End Function Der Test mit {2, 2, 2, 1, 1} liefert diese Ausgabe:
Die 8 Bücher kosten zum Normalpreis 64,00 €.
Günstigster Kaufpreis mit Rabatt: 51,20 €
Ersparnis: 12,80 € Rabatt: 20,00%
Der Test mit {7, 4, 6, 4, 3} liefert diese Ausgabe:
Die 24 Bücher kosten zum Normalpreis 192,00 €.
Günstigster Kaufpreis mit Rabatt: 154,00 €
Ersparnis: 38,00 € Rabatt: 19,79%
Ich kann nicht 100%-ig garantieren, dass es immer den besten Preis findet, aber alle Tests waren bisher Korrekt. |