function Solve-ChangeMaking
{
param(
[ValidateNotNull()]
[ValidateRange(0.01, 10000)]
[decimal]$rest=.99,
[ValidateNotNullorEmpty()]
[ValidateScript({
if($_ -lt 0.01 -OR $_ -gt 500)
{
throw "Not allowed nominations. Use nomination from 0.01 to 500"
}
return $true
})]
[array]$nominations =@(.99)
)
[array]$returnChange =@()
[decimal]$remainedRest = $rest
$availableNominations = New-Object "System.Collections.Generic.List``1[decimal]"
#it should be 'list of deciaml' because problem with removeAt method
$nominations | % { #adding nominations to list of decimals
$availableNominations.Add($_)
}
$quantity = 0
while($remainedRest -gt 0)
{
[decimal]$max = ($availableNominations | measure -Maximum).Maximum
$index = $availableNominations.IndexOf($max);
if($index -lt 0)
{
break
}
if($remainedRest -ge $max )
{
$remainedRest -= $max
$returnChange +=$max
$quantity++
}
$availableNominations.RemoveAt($index)
if($availableNominations.Count -eq 0)
{
break
}
}
return New-Object PSObject -Property @{
Quantity = $quantity;
'Remained Rest' = $remainedRest;
'Change to return' = ($returnChange -join ' ');}
}
Do przetestowania algorytmu będziemy chcieli wydać resztę 97 groszy mając do dyspozycji 1, 2, 10, 20 i 50 groszy. Oczywiście zabraknie nam pieniędzy do wydania reszy:
Solve-ChangeMaking -rest .97 -nominations 0.10, 0.20, 0.50, 0.02, 0.01
I wyniki:
Quantity : 5
Change to return : 0,5 0,2 0,1 0,02 0,01
Remained Rest : 0,14
Albo inny przykład z większą ilością gotówki:
$money = (20, 10, 5, 2, 1, .50, .20, .10, 0.05, .02, 0.01) *5 + 50 + 50 Solve-ChangeMaking -nominations $money -rest (200-0.99)
A wyniki są następujące:
Quantity : 11
Change to return : 50 50 20 20 20 20 10 5 2 2 0,01
Remained Rest : 0,00
Brak komentarzy:
Prześlij komentarz