如何在c ++中编写递归硬币更改?

时间:2016-05-14 02:00:21

标签: c++ recursion coin-change

我正在尝试在c ++中构建一个用于硬币更改的递归调用。我在互联网上尝试了大部分算法,但它似乎不适用于矢量或它没有使用的硬币总和。任何人都可以帮我理解递归函数必须调用的内容吗?所以我的算法没有给我使用最少数量的硬币,也不知道如何保存使用的硬币。

int coin(vector<int> denom, int s,int N)
{
    if(N == 0)
    {
        return 1;
    }
    if(N < 0 || (N > 0 && s < 0))
    {
        return 0;
    }

    return min(coin(denom,s - 1, N), 1 + coin(denom, s,N-denom[s-1]));

}


 Input a value N:
    Input: 40
 Input how many denominations:
    Input: 3
 Denominations #1: 
    Input: 5
 Denominations #2:
    Input: 20
 Denominations #3:
    Input: 30

 Output:
 Minimum # of coins: 2
 Coin used: 20 + 20
 Don't want:  30 + 5 + 5

1 个答案:

答案 0 :(得分:3)

需要考虑的一些要点:

  • 首先,无需发送面额数,即s 作为coin方法的参数,只要使用vector,因为vector具有内置size()方法,可以为我们完成这项工作。
  • 其次,保存解决方案,您需要另一个名为vector的{​​{1}} int,但此solution只是为了保留记录并且与实际的递归实现无关,因此,它被定义为全局变量。或者,您也可以通过引用vector方法将其作为参数传递。
  • 第三,在将用户输入的面额传递给coin方法之前,应对其进行排序。为此,我使用了coin库中的sort方法。

递归算法的基本功能是:

  • 在每一步中,它会考虑最大面额algorithm(排序面额中的最后一个元素d vector,如denom),然后将其从{{1使用denom[denom.size() - 1]的{​​{3}}方法。
  • 使用vector我们找到vector,这是解决方案中使用的面额d的硬币数。我们通过简单地应用像count_d这样的div操作来实现这一点,它提供了商数
  • 然后d被添加到N/d dvector次。
  • 递归调用,在此次迭代中添加solution,并使用减少的面额count_d count_d剩余调用coin vector {1}}使用denom

有关div N和mod N%d运算符的清晰度,请参阅pop_back

以下是代码:

/