当前位置: 首页 > 知识库问答 >
问题:

循环换币

越姚石
2023-03-14

我的程序似乎每次调用最小函数时都会崩溃。有人能告诉我为什么它会崩溃吗。在我调用最小值函数后,它会立即冻结。是因为我在使用向量吗?

#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>

using namespace std;

int minimum(vector<int> denom, int s, int N) //take in denomination , sizeofcoin, and value of N
{
    if(N == 0)
    {
        return 1;
    }
    else if(N < 0 || (N > 0 && s <=0))
    {
        return 0;
    }
    else
    {
        return min(minimum(denom,s - 1, N), 1 + minimum(denom, s,N-denom[s-1]));
    }
}
int main()
{
    int N;
    unsigned int sizeofcoin;
    cout << "Enter the value N to produce: " << endl;
    cin >> N;
    cout << "Enter the number of different denominations: " << endl;
    cin >> sizeofcoin;

    vector<int> denom(sizeofcoin);
    for(unsigned int i= 0; i < sizeofcoin; i++)
    {
        cout << "Enter denomination #" << (i+1) << endl;          //save all the denominations in an array
        cin >> denom[i];
    }

    sort(denom.begin() , denom.end(),greater<int>());    //sort the array from largest to smallest
    if(denom.back() != 1)                                 //check the end of the array (since the back is smallest now) if it has 1
    {
        denom.push_back(1);                             //Will include 1 if the user does not input a 1 (doesn't have to be used)
    }
    minimum(denom,sizeofcoin,N);
    return 0;
}

共有3个答案

韦鸣
2023-03-14

我想指出的另一件事是,您试图返回两个值的总和:

(minimum(denom,s - 1, N) + minimum(denom, s,N-denom[s-1])

相反,你应该做的是:

min(minimum(denom,s - 1, N), 1 + minimum(denom, s,N-denom[s-1]))

这个想法是,在第一次通话中,您没有使用任何硬币,但在第二次通话中,您使用了一枚硬币,因此添加1表示相同。

寻找一个同样的动态规划解决方案。https://people.cs.clemson.edu/~bcdean/dp_实践/

辛渝
2023-03-14

您有递归调用最小值(denom,s-1,N),因此N永远不会小于或等于0,递归也永远不会结束。

如果您学会了如何使用调试器,并逐行遍历代码,进入递归调用,这将很容易找到。

吴炎彬
2023-03-14

我试图向你的橡皮鸭解释你的最小()函数,你的橡皮鸭有一个问题要问你。我们的谈话是这样进行的:

int minimum(vector<int> denom, int s, int N) //take in denomination , sizeofcoin, and value of N
{
    if(N <= 0)
    {
        return 0;
    }

Me:thisminimum()递归函数在其第三个参数N为0或负值时立即返回。

你的橡皮鸭:好的。

    return (minimum(denom,s - 1, N)...

(在这里,我试着向你的橡皮鸭解释你的第一个递归调用):

我:所以,这是一个递归调用,参数相同,除了第二个参数递减。第三个参数是N

你的橡皮鸭:所以,如果第三个参数的值,N,是不变的,并且递归函数返回没有递归只有当N是0或负数,并且初始调用最小()传递一个更大的值N的值大于0,那么您期望这个递归何时停止?

我自己不能回答这个问题,也许你可以自己向你的橡皮鸭解释。递归何时停止,这里?

 类似资料:
  • 我想在文件目录上迭代此代码: 我目录中的图像: Film_Crew.jpg Film\u Crew副本。jpg公司 Film_Crew复制2.jpg Film\u Crew副本3。jpg公司 Film\u Crew副本4。jpg公司 Film\u Crew副本5。jpg公司 Film\u Crew副本6。jpg公司 我尝试使用此代码,因为上次尝试时它对我有效,但现在不起作用。 我在终端的Mac电脑

  • 问题内容: 我正在尝试将此for循环重写为for每个循环。 这就是我尝试过的 谁能指出我正确的方向?谢谢。 问题答案: 我认为您想得太多… :)

  • 我尝试将一个循环转换为一个循环在flutter中等待循环。我想要循环的元素是Firebase实时数据库中的快照。 我的函数如下所示: 我尝试了不同的方法,但是我没有让函数工作。 第一次尝试: 错误: 未处理的异常:键入'_InternalLinkedHashMap 第二次尝试: 错误: 未处理的异常:键入'_InternalLinkedHashMap 在所有的尝试中,我都得到了相同的错误。但是上述

  • 给出了一个连通的加权图,它的权值是非负的。我想把它转换成一个连通的无环图,这样删除的边的权重之和最小化。输出将是移除的边缘。 我的想法:由于连通无环图是一棵树,所以我可以简单地取最大边,去掉所有其他边。但是,这可能并不总是正确的。它可能导致一个断开的图。

  • 您好,我对jquery没有什么问题。首先,我有: 大众BORA 1.9TDI 1990 1995 奥迪A3 2.0TFSI 2006 2008 但我想实现: VW BORA 1.9TDI 1990 VW BORA 1.9TDI 1991 VW BORA 1.9TDI 1992 VW BORA 1.9TDI 1993 VW BORA 1.9TDI 1994 VW BORA 1.9TDI 1995 A

  • 我正在寻找一种用函数式编程方法替换嵌套foreach循环的方法。情况是这样的: 目前我的代码是这样的: 这将生成如下所示的输出: 有谁知道如何用函数式编程替代方案替换foreach代码块?