fix: makeChangeDynamic
This commit is contained in:
parent
9d3d8fd804
commit
eceea49417
1 changed files with 68 additions and 28 deletions
|
|
@ -48,37 +48,77 @@ function makeChangeDuo (cassettes, amount) {
|
|||
}
|
||||
|
||||
function makeChangeDynamic (cassettes, amount) {
|
||||
const cassetteMap = _.map(cassettes, it => ({
|
||||
denomination: it.denomination
|
||||
}))
|
||||
while (_.size(cassettes) < 4) {
|
||||
cassettes.push({ denomination: 0, count: 0 })
|
||||
}
|
||||
|
||||
const solutions = []
|
||||
const amountNum = amount.toNumber()
|
||||
|
||||
const sortedCassettes = _.orderBy(cassetteMap, ['denomination'], ['desc'])
|
||||
|
||||
const finalDist = []
|
||||
|
||||
let mutableAmount = _.clone(amountNum)
|
||||
|
||||
while(mutableAmount >= 0) {
|
||||
_.each(sortedCassettes, it => {
|
||||
if (mutableAmount === 0) {
|
||||
finalDist.push({ provisioned: 0, denomination: it.denomination, id: uuid.v4() })
|
||||
return
|
||||
for (let i = 0; i * cassettes[0].denomination <= amountNum; i++) {
|
||||
for (
|
||||
let j = 0;
|
||||
i * cassettes[0].denomination + j * cassettes[1].denomination <=
|
||||
amountNum;
|
||||
j++
|
||||
) {
|
||||
for (
|
||||
let k = 0;
|
||||
i * cassettes[0].denomination +
|
||||
j * cassettes[1].denomination +
|
||||
k * cassettes[2].denomination <=
|
||||
amountNum;
|
||||
k++
|
||||
) {
|
||||
for (
|
||||
let l = 0;
|
||||
i * cassettes[0].denomination +
|
||||
j * cassettes[1].denomination +
|
||||
k * cassettes[2].denomination +
|
||||
l * cassettes[3].denomination <=
|
||||
amountNum;
|
||||
l++
|
||||
) {
|
||||
if (
|
||||
i * cassettes[0].denomination +
|
||||
j * cassettes[1].denomination +
|
||||
k * cassettes[2].denomination +
|
||||
l * cassettes[3].denomination ===
|
||||
amountNum &&
|
||||
i <= cassettes[0].count &&
|
||||
j <= cassettes[1].count &&
|
||||
k <= cassettes[2].count &&
|
||||
l <= cassettes[3].count && i > 0 && j > 0 && k > 0 && l > 0
|
||||
) {
|
||||
solutions.push([
|
||||
{
|
||||
provisioned: i,
|
||||
denomination: cassettes[0].denomination,
|
||||
id: uuid.v4()
|
||||
},
|
||||
{
|
||||
provisioned: j,
|
||||
denomination: cassettes[1].denomination,
|
||||
id: uuid.v4()
|
||||
},
|
||||
{
|
||||
provisioned: k,
|
||||
denomination: cassettes[2].denomination,
|
||||
id: uuid.v4()
|
||||
},
|
||||
{
|
||||
provisioned: l,
|
||||
denomination: cassettes[3].denomination,
|
||||
id: uuid.v4()
|
||||
}
|
||||
])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const remainder = mutableAmount % it.denomination
|
||||
const amountToSub = mutableAmount - remainder
|
||||
const numberOfBills = amountToSub / it.denomination
|
||||
mutableAmount -= amountToSub
|
||||
|
||||
finalDist.push({ provisioned: numberOfBills, denomination: it.denomination, id: uuid.v4() })
|
||||
return
|
||||
const sortedSolutions = _.sortBy(solutions, it => {
|
||||
_.reduce(it, (acc, value) => acc + value.provisioned, 0)
|
||||
})
|
||||
|
||||
if (mutableAmount === 0) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return finalDist
|
||||
return _.head(sortedSolutions)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue