我的C++解决方案出了什么问题?

What's wrong with my C++ solution?

本文关键字:什么 问题 C++ 解决方案 我的      更新时间:2023-10-16

以下是问题描述:

编写一个函数,计算你可以使用多少种不同的方法给定一系列硬币面额的一定数额的零钱。例如,如果你有硬币,有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,改变向量,尽管它们应该在相同的数字列表上工作。

传递值。

您需要将问题空间一分为二。问题是你的算法还是你的实现?首先写下你的算法。然后在纸上对你得到错误答案的情况执行你的算法,看看算法是否得到了正确的答案。

如果算法得到了错误的答案,那么算法就被破坏了。您有一个非编程问题。

如果算法得到了正确的答案,那么您的实现就被破坏了。现在,您可以使用调试器或其他日志记录来查看实现与纸面工作的不同之处。