【问题标题】:ATM withdrawal algorithmATM取款算法
【发布时间】:2019-03-02 09:20:14
【问题描述】:

ATM 取款算法是如何工作的?

从 ATM 取款的代码应该是这样的:

// count of nominals in ATM
let limits = {
  1000: 5,
  500: 2,
  100: 5,
  50: 100,
  30: 6
}

let getMoney = (amount, limits) => {
  ...
};

console.log(getMoney(1000, limits)); // {1000: 1}
console.log(getMoney(230, limits)); // {} | i need {100: 2, 30: 1}
console.log(getMoney(200, limits)); // {100: 2}
console.log(getMoney(150, limits)); // {50: 3} | i need {100: 1, 50: 1}
console.log(getMoney(120, limits)); // {30: 4}

我试过了,做了这个:

let getMoney = (am, lm) => {
  Object.keys(lm).map( k => {
    if(lm[k] && am / k >= 1 && am % k === 0)
      if(lm[k] > am / k)
        r[k] = am / k;
  });
};

...但结果不正确:

console.log( getMoney(1000, limits) ); // {1000: 1}
console.log( getMoney(230, limits) ); // {} | i need {100: 2, 30: 1}
console.log( getMoney(200, limits) ); // {100: 2}
console.log( getMoney(150, limits) ); // {50: 3} | i need {100: 1, 50: 1}
console.log( getMoney(120, limits) ); // {30: 4}

我怎样才能让它工作?

【问题讨论】:

  • 请添加您的尝试。什么不起作用?是上学的吗?
  • 同时发布你到目前为止所尝试的内容。
  • 我不想浪费时间去猜测 dict limits 的含义,请添加一些评论来解释你的算法
  • @MoreFreeze 我添加了一条评论
  • Thiat 是一个回弹问题,您的算法在这里不起作用。你的算法有很多问题:1.你不做am -= am / k * k,如果客户需要提现230,你发现你可以提供2个100,剩下的你需要计算的是30而不是230。2.@987654326 @ 这里。做一些反例很容易。想想吧。

标签: javascript algorithm limit


【解决方案1】:

您的算法假设如果有解决方案,那么该解决方案将采用仍然适合剩余金额的最高可用面额的大部分。这适用于某些面额集合,例如常见的面额(1000、500、200、100、50、20、10、5、2、1),但不适用于您示例中的面额。

这是change making problem 的变体,是一个“难题”,因为您必须尝试大量的组合。一种方法是至少优先考虑采用许多较高价值面额的尝试,并且仅在那些无法解决问题的情况下尝试替代方案。

你可以这样编码:

let getMoney = (amount, limits) => {
    let recur = (amount, nominals) => {
        if (amount == 0) return {}; // success
        if (!nominals.length) return; // failure
        let nominal = nominals[0];
        let count = Math.min(limits[nominal], Math.floor(amount / nominal));
        for (let i = count; i >= 0; i--) {
            let result = recur(amount - i*nominal, nominals.slice(1));
            if (result) return i ? { [nominal]: i, ...result } : result;
        }
    }
    return recur(amount, Object.keys(limits).map(Number).sort((a,b) => b - a));
};

// count of nominals in ATM
let limits = { 1000: 5, 500: 2, 100: 5, 50: 100, 30: 6 }

console.log(getMoney(1000, limits)); // {1000: 1}
console.log(getMoney(230, limits)); // {30: 1, 100: 2}
console.log(getMoney(200, limits)); // {100: 2}
console.log(getMoney(150, limits)); // {50: 1, 100: 1}
console.log(getMoney(120, limits)); // {30: 4}

【讨论】:

    【解决方案2】:

    Javascript中的ATM面额程序。

    在这里,它将找到不同面额的纸币的最小数量,这些纸币合计输入的金额。从最高面额的钞票开始到最低面额的钞票。

    检查此https://stackoverflow.com/a/66456375/9248245。这可能对其他人有所帮助

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多