JSFiddle - React, Tailwind, and code Playground
by SASSACB
HTML
<div id="question"></div>
<div id="bills"></div>
<div id="sum"></div>
JavaScript
//Available bills and money required
//var availableBills = [2, 5, 8, 16]; var money = 22;
//var availableBills = [13, 17, 30, 70, 158]; var money = 200;
var availableBills = [0.01,0.02,0.05, 0.10,0.20,0.50,1,2, 5, 10, 20, 50,];
var money = 89.25;
//var availableBills = [5, 10, 178]; var money = 20;
//var availableBills = [5, 20, 30, 70, 158]; var money = 157;
//var availableBills = [1, 5, 10]; var money = 97;
//Get all the money in a wallet
function getWalletSum(wallet) {
var sum = 0;
for (var bill in wallet) {
sum += wallet[bill] * bill;
}
return sum;
}
//Copy a wallet without empty values
function copyWallet(wallet) {
var newWallet = {};
for (var bill in wallet) {
if (wallet[bill] != 0) {
newWallet[bill] = wallet[bill];
}
}
return newWallet;
}
//Merge two wallets without empty values
function mergeWallets(wallet1, wallet2) {
var mergedWallet = copyWallet(wallet1);
for (var bill in wallet2) {
if (wallet2[bill] != 0) {
mergedWallet[bill] = wallet2[bill];
}
}
return mergedWallet;
}
var cycles = 0;
var loops = 0;
//Get possible wallets
//Return wallets having sum >= money
function getPossibleWallets(money, startingBills) {
cycles++;
var possibleWallets = [];
var wallet = {};
var bills = startingBills.slice();
var maxBill = bills.pop();
wallet[maxBill] = Math.ceil(money / maxBill);
while (wallet[maxBill] >= 0) {
loops++;
var walletSum = getWalletSum(wallet);
if (walletSum == money) {
possibleWallets.push(copyWallet(wallet));
return possibleWallets;
}
if (walletSum > money) {
possibleWallets.push(copyWallet(wallet));
} else {
if (bills.length > 0) {
var remaining = money - getWalletSum(wallet);
var remainingWallets = getPossibleWallets(remaining, bills);
for (var i = 0; i < remainingWallets.length; i++) {
var mergedWallet = mergeWallets(wallet, remainingWallets[i]);
possibleWallets.push(mergedWallet);
...