javascript ATM取款算法

时间:2019-03-02 09:20:15

标签: javascript algorithm limit

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}

2 个答案:

答案 0 :(得分:1)

您的算法假设,如果有解决方案,则该解决方案将采用最大的可用面额中的大多数,仍与剩余金额相称。这适用于某些种类的面额,例如普通面额(1000、500、200、100、50、20、10、5、2、1),但不适用于您的示例中的面额。

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

您可以这样编码:

{
    ...
    "content_scripts":          [
        {
           ...
            "css":        [
                "css/font-awesome.min.css",
                ...
            ]
            ...
        }
    ],
    ...
    "web_accessible_resources": [
        ...
        "fonts/FontAwesome.otf",
        "fonts/fontawesome-webfont.eot",
        "fonts/fontawesome-webfont.svg",
        "fonts/fontawesome-webfont.ttf",
        "fonts/fontawesome-webfont.woff",
        "fonts/fontawesome-webfont.woff2",
    ]
}

答案 1 :(得分:0)

Javascript 中的 ATM 面额程序。

在这里,它会找到与输入金额相加的不同面额纸币的最小数量。从最高面额的纸币到最低的纸币。

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