【问题标题】:Difficult Coin exchange algorithm困难的硬币交换算法
【发布时间】:2021-12-12 21:32:58
【问题描述】:

我正在尝试构建一种交换算法,以交换与存货数量相同的硬币。 我有一本包含面额和金额的键值对的字典

输入是要返回的值,例如 €2,80 我需要一种算法来计算考虑股票的最佳回报方式。
(最好的办法是使库存硬币数量的标准差最小,这意味着所有面额的硬币数量相同) 所以在这个例子中,我需要退回 1 欧元、20 克拉和 10 克拉的硬币,因为 2 欧元和 50 克拉的硬币几乎缺货。 在这种情况下,最好的输出是:

 {200, 0}, 
 {100, 2}, 
 {50, 0}, 
 {20, 3},
 {10, 2}

如何使用 c++ 算法计算每个面额的最佳回报数并保持所有硬币的库存相同?

#include <map>

static map<int, int, greater<int>> ValueAmount = {
    {200, 3}, 
    {100, 20}, 
    {50, 2}, 
    {20, 15},
    {10, 14}
};

std::map<int, int> PayoutAlgorithm(std::map<int, int> ValueAmount, long amountToPay){
    
}

int main(int argc, char** argv){
    ...

    bool succes = ReturnMoney(PayoutAlgorithm());

    ...
    return 1;
}

其中 map ValueAmount 是一个键值对。关键是硬币的面额,价值是存在的硬币数量。

【问题讨论】:

  • 这里还没有定义什么是“最好的”。您希望我们代替您决定什么是“最佳”吗?那将是征求意见,以及结束问题的理由。您必须弄清楚什么是“最佳”,然后更新问题。
  • 另外,示例中的数字不匹配。例如,它们将匹配 2.30 欧元而不是 2.80 欧元。
  • 这听起来像是the coin change problem 的变体。您可能想从那里开始。
  • What is best 但说真的,建议:不要使用任何浮点数。使用最小的硬币作为基准单位并使用fixed point arithmetic 以避免舍入错误。
  • @user4581301 从最小值开始计算仅适用于某些面额集合。鉴于该面额列表是算法的输入,因此可以安全地假设会有测试用例对此进行检查。

标签: c++ algorithm math


【解决方案1】:

解决此类问题的方法是将其分解为更易于理解的内容。

  1. 我们对我们的数据结构满意吗?坦率地说,我会使用一个包含数量和计数的类,而不是两个不同的数组,但这就是我。

  2. 确定我需要给他们多少(以您的最低值 - 没有浮点数)。例如,127 美分。

  3. 开始分发硬币,从最大面额开始向下移动。例如,1 磅硬币、25 美分硬币和 2 个 1 美分硬币。

  4. 如果您用完了特定硬币,那么您只需要使用更多的下一个较低面额的硬币。

【讨论】:

  • 这(称为贪婪方法)甚至不是 OP 问题的更复杂版本的基本问题的有效解决方案。
  • @Frank 我期待您的回答。这是一个开始,比任何人给他的都要多。
  • Welp,我正在写一些我觉得可以让 OP 走上正轨的东西,但现在问题已经结束,它必须等待。
  • @Frank,问题又来了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多