设计一个收银程序 checkCashRegister()
,其把购买价格(price
)作为第一个参数 , 付款金额 (cash
)作为第二个参数, 和收银机中零钱 (cid
) 作为第三个参数.
cid
是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 "Insufficient Funds"
. 如果正好则返回字符串 "Closed"
.
否者, 返回应找回的零钱列表,且由大到小存在二维数组中.
// 贪心 greedy
function checkCashRegister(price, cash, cid) {
var change = [];
// Here is your change, ma'am.
var cidDic = {
"ONE HUNDRED": {val: 100.00},
"TWENTY": {val: 20.00},
"TEN": {val: 10.00},
"FIVE": {val: 5.00},
"ONE": {val: 1.00},
"QUARTER": {val: 0.25},
"DIME": {val: 0.10},
"NICKEL": {val: 0.05},
"PENNY": {val: 0.01},
};
for(var i = 0; i < cid.length; i++) {
cidDic[cid[i][0]].num = (cid[i][1] * 1e3) / (cidDic[cid[i][0]].val * 1e3); // 修正js浮点数计算误差
}
var diff = cash - price;
for(var key in cidDic) {
var total = 0;
while(diff >= cidDic[key].val && cidDic[key].num > 0) {
cidDic[key].num--;
total++;
diff = (diff * 1e3 - cidDic[key].val * 1e3) / 1e3;
if(cidDic[key].num === 0 || diff < cidDic[key].val) {
change.push([key, total * (cidDic[key].val)]);
break;
}
}
}
if (diff === 0) {
for (var key in cidDic) {
if (cidDic[key].num !== 0) {
return change;
}
}
return "Closed";
} else {
return "Insufficient Funds";
}
}
// Example cash-in-drawer array:
// [["PENNY", 1.01],
// ["NICKEL", 2.05],
// ["DIME", 3.10],
// ["QUARTER", 4.25],
// ["ONE", 90.00],
// ["FIVE", 55.00],
// ["TEN", 20.00],
// ["TWENTY", 60.00],
// ["ONE HUNDRED", 100.00]]
checkCashRegister(3.26, 100.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) // [["TWENTY",60],["TEN",20],["FIVE",15],["ONE",1],["QUARTER",0.5],["DIME",0.2],["PENNY",0.04]]