// Candidate denominations var candidates = [0.02,0.03,0.04,0.05,0.06,0.7,0.08,0.09,0.10,0.12,0.13,0.15,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.60,0.7,0.8,0.9,1]; // All amounts between one cent and a dollar var amounts = Array .apply(0, Array(100)) .map(function (element, i) { return (i+1)/100; }); // Standard combinatory function function comb(c) { var n = candidates.length; var s=[]; function bitprint(u) { var s=[]; for (var n=0; u; ++n, u>>=1) if (u&1) s.push(candidates[n]); return s; } function bitcount(u) { for (var n=0; u; ++n, u=u&(u-1)); return n; } for (var u=0; u<1< 0) { p += Math.floor(s/d); s = s % d; } return p; },0); },0); return (p && p.score < score) ? p : { score: score, denom: c}; }); }