硬币兑换问题

Coin Change Problems

本文关键字:问题 硬币      更新时间:2023-10-16

>假设我有4枚面额为1 3 4 5的硬币。我想让它成为 7.我学习如何找到多少种可能的方法。但我想确定必须使用的最小硬币数量是多少。示例:5+1+1=7 再次 3+4=7。所以硬币的最小数量是2。任何伪代码或解释或源代码都会有所帮助

如果要更改数字 n,请设置一个数组 number_of_coins[n] 并从左到右填写。 显然,number_of_coins[0] 是 0。接下来的几个你可以手动完成(尽管一旦你有了算法,它就会自动填充它们)。要在数组中填写较大的条目 m,请考虑以下情况:如果我从 m 中删除 1 美分会怎样?还是3美分?还是4美分?还是5美分?

一旦你拥有最多n个硬币数组,你可以向后走过它以找到要使用的确切硬币。

我会试一试。 我认为你应该定义一个面额的向量:

vector<int> denominations {1,3,5,7};

那里,编写一个递归函数,该函数接收面额以及从面额中获得的金额:

int recursive_totals(const vector<int> denominations, int amount_to_make);

如果amount_to_make小于或等于 0,此函数将返回 0,否则它将遍历面额:

int sum_totals = 0;
for (int denom : denominations)
{
    if (amount_to_make - denom == 0)
        sum_totals+=1;
    else
        sum_totals+=recursive_totals(denominations, amount_to_make - denom);
}

这是粗略的代码,可能需要调整,但我认为递归函数在这里有效。 我看到的一个直接问题是顺序与我在这里编写的方式无关紧要,您可能会得到重复项,但是有一种方法可以解决这个问题。

编辑:我让它工作,但不会在这里发布代码。 这种方法有效,如果您选择尝试,请随时提出您需要的任何问题,我会尽力提供帮助。