如何在 c++ 中编写递归硬币更改
How can i program a recursive coin change in c++?
我正在尝试在 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
方法的参数,只要使用vector
,vector
内置size()
方法可以为我们完成这项工作。 - 其次,要保存解决方案,您需要另一个名为
solution
的int
vector
,但此vector
只是为了保留记录,与实际的递归实现无关,因此,它被定义为全局变量。或者,您也可以通过引用coin
方法将其作为参数传递。 - 第三,用户输入的面额在传递给
coin
方法之前应进行排序。为此,我使用了algorithm
库中的排序方法。
递归算法的基本作用是:
- 在每一步中,它考虑最大的面额
d
(排序面额中的最后一个元素vector
denom
如denom[denom.size() - 1]
(,然后使用pop_backvector
方法将其从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");
}
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 如何在 c++ 中编写递归硬币更改
- 使用递归进行硬币更改的基本情况是什么
- 迭代方法似乎比递归实现(硬币更换)慢