首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ATM提款算法

ATM提款算法
EN

Stack Overflow用户
提问于 2019-03-02 17:20:15
回答 2查看 2.3K关注 0票数 1

自动柜员机取款算法是如何工作的?

从自动取款机取钱的代码应该是这样的:

代码语言:javascript
复制
// 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}

我试过了,做了这个:

代码语言:javascript
复制
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;
  });
};

...but结果不正确:

代码语言:javascript
复制
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}

我怎么才能让它工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-02 18:40:18

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

这是change making problem的一种变体,是一个“难”的问题,因为您可能需要尝试大量的组合。一种方法是至少优先考虑采用许多较高价值面值的尝试,只有在这些尝试不能导致解决方案时才尝试替代方案。

你可以像这样编写代码:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2021-03-03 19:47:32

用Javascript编写的自动柜员机计价程序。

在这里,它将找到不同面额的纸币的最小数量,它们的总和为输入的金额。从最高面额的纸币到最低面额的纸币。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54956991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档