以下是问题描述:
编写一个函数,计算您可以使用多少种不同的方法 考虑到一系列硬币面额,换一笔钱。 例如,如果您有硬币,有3种方法可以为4提供更改 与面额1和2:
1 + 1 + 1 + 1,1 + 1 + 2,2 + 2。
硬币的顺序无关紧要:
1 + 1 + 2 == 2 + 1 + 1
另外,假设您拥有无限数量的硬币。
您的功能应该更改一个数量和一个唯一的数组 硬币的面额:
count_change(4,[1,2])#=> 3
count_change(10,[5,2,3])#=> 4
count_change(11,[5,7])#=> 0
我已经为这个问题编写了一个C ++实现,但是,对于一些没有得到正确答案的测试用例。例如,count_change(10, {5, 2, 3})
的输出为2,而预期输出为4.我还没有弄清楚我的程序有什么问题,谁可以指出我的解决方案的缺点?
以下是我的解决方案,我试图通过使用递归来解决问题:
#include<iostream>
#include<vector>
using namespace std;
int count_change(int money, vector<int>& coins)
{
int count = 0;
if(coins.size() == 1){
if(money % coins[0] == 0)return 1;
else return 0;
}
int last = coins[coins.size()-1];
coins.pop_back();
for(int i = 0; i < money/last; i++)
count += count_change(money-i*last, coins);
return count;
}
int main()
{
vector<int> coins = {5, 2, 3};
cout<<count_change(10, coins)<<endl;
}
答案 0 :(得分:3)
您通过引用传递矢量。
每个递归调用(在循环中!)将自己执行pop_back
,改变向量,但它们应该在同一个数字列表上工作。
按值传递。
答案 1 :(得分:0)
您需要将问题空间分成两半。你的算法或实现有问题吗?首先写下你的算法。然后在纸上执行您的算法,以获得错误答案并查看算法是否得到正确答案。
如果算法得到错误答案,则算法会被破坏。你有一个非编程问题。
如果算法得到正确的答案,那么您的实施就会被破坏。您现在可以使用调试器或其他日志记录来查看实现与您在纸上所做的工作的不同之处。