我的C++解决方案出了什么问题?
What's wrong with my C++ solution?
以下是问题描述:
编写一个函数,计算你可以使用多少种不同的方法给定一系列硬币面额的一定数额的零钱。例如,如果你有硬币,有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;
}
通过引用传递向量。
每个递归调用(在循环中!)都会执行自己的pop_back
,改变向量,尽管它们应该在相同的数字列表上工作。
传递值。
您需要将问题空间一分为二。问题是你的算法还是你的实现?首先写下你的算法。然后在纸上对你得到错误答案的情况执行你的算法,看看算法是否得到了正确的答案。
如果算法得到了错误的答案,那么算法就被破坏了。您有一个非编程问题。
如果算法得到了正确的答案,那么您的实现就被破坏了。现在,您可以使用调试器或其他日志记录来查看实现与纸面工作的不同之处。
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了