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

How can i program a recursive coin change in c++?

本文关键字:递归 硬币 c++      更新时间:2023-10-16

我正在尝试在 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

需要考虑的几点:

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

递归算法的基本作用是:

  • 在每一步中,它考虑最大的面额d(排序面额中的最后一个元素vector denomdenom[denom.size() - 1](,然后使用pop_back vector方法将其从vector中删除。
  • 使用d我们找到count_d,这是解决方案中使用的面额d硬币的数量。我们通过简单地应用像 N/d 这样的div 运算来得到这一点,它给出了
  • 然后将d添加到vector solution中,count_d次数。
  • 递归调用,从此迭代中添加count_d,并使用N%d调用具有减少面额vector denom金额的剩余N coin

请参阅商和余数,以明确div / 和 mod %运算符的作用。

这是代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution;
int coin(vector<int> denom, int N)
{
    if(N <= 0 || denom.size() <= 0)
    {
        return 0;
    }
    int d = denom[denom.size() - 1];
    denom.pop_back();
    int count_d = N/d;
    solution.insert(solution.end(), count_d, d);
    return count_d + coin(denom, N%d);
}
int main()
{
    int N,s;
    cout<<"Input a value N:nInput: ";
    cin>>N;
    cout<<"Input how many denominations:nInput: ";
    cin>>s;
    vector<int> denom;
    for(int i = 0; i < s; i++)
    {
        int d;
        cout<<"Denominations #"<<i+1<<":nInput: ";
        cin>>d;
        denom.push_back(d);
    }
    std::sort(denom.begin(), denom.end());
    int minNoOfCoins = coin(denom, N);
    cout<<"nOutput:nMinimum # of coins: "<<minNoOfCoins;
    if(minNoOfCoins > 0)
    {
        cout<<"nCoins used: ";
        for(int i = 0; i < solution.size(); i++)
        {
            if(i > 0)
            {
                cout<<" + ";
            }
            cout<<solution[i];
        }
    }
    cout<<endl;
    system("pause");
}