【发布时间】: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 从最小值开始计算仅适用于某些面额集合。鉴于该面额列表是算法的输入,因此可以安全地假设会有测试用例对此进行检查。