我正在尝试在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
答案 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
d
,vector
次。solution
,并使用减少的面额count_d
count_d
和剩余调用coin
vector
{1}}使用denom
。有关div N
和mod N%d
运算符的清晰度,请参阅pop_back。
以下是代码:
/