Переполнение стека для дробного ранца - PullRequest
1 голос
/ 13 марта 2020

Я довольно новичок в C ++. Я реализовал проблему дробного ранца в c ++ для курса "Algorithmi c Toolbox" на Coursera:

#include <iostream>
#include <iomanip>

using namespace std;

int get_max_index(double A[], double B[],int l)
{
    /*
    int A = array of value
    int B = array of weights
    int l = length of the array
    */
    int p,Max{0};
    for(int j=0;j<l;j++)
    {
        if((A[j]/B[j]) > Max){Max = A[j]/B[j];p = j;}
    }
    return p;
}

int main()
{
    int n,W,q,Max{0},W1{0};
    cin >> n >> W;
    double values[n],weights[n],loot{0};
    for(int i=0;i<n;i++)
    {
        cin >> values[i] >> weights[i];
    }
    for(int j=0;j<n;j++)
    {
        if(W==0){break;}
        else
        {
            q = get_max_index(values,weights,n);
            if(weights[q] <= W){W1 = weights[q];}
            else{W1 = W;}
            loot += W1 * (values[q]/weights[q]);
            W -= W1;
            weights[q] -= W1;
            if(weights[q] == 0){values[q] = 0;}
        }
    }
    cout << setprecision(4) << fixed;
    cout << loot << endl;
}

После отправки этого кода я получил ошибку переполнения стека (неизвестный сигнал 11). Пожалуйста, помогите мне понять, почему это происходит, и решить эту проблему.

РЕДАКТИРОВАТЬ:

Я изменил код. Я не использую функцию get_max_index с массивами динамического размера. Вот новый код:

#include <iostream>
#include <iomanip>

using namespace std;


int main()
{
    long long int n,W,q,p,Max{0},W1{0};
    cin >> n >> W;
    long double values[n],weights[n],loot{0},VPU[n];
    for(long long int i=0;i<n;i++)
    {
        cin >> values[i] >> weights[i];
        VPU[i] = values[i] / weights[i];
    }
    for(long long int j=0;j<n;j++)
    {
        if(W==0){break;}
        else
        {
            for(long long int k=0;k<n;k++)
            {
                if(VPU[k] > Max){Max = VPU[k];p=k;}
            }
            Max = 0;
            q = p;
            if(weights[q] <= W){W1 = weights[q];}
            else{W1 = W;}
            loot += W1 * (values[q]/weights[q]);
            W -= W1;
            weights[q] -= W1;
            if(weights[q] == 0){VPU[q] = 0;}
        }
    }
    cout << setprecision(4) << fixed;
    cout << loot << endl;
}

1 Ответ

0 голосов
/ 13 марта 2020

Стандарт C ++ не допускает массив переменной длины. Так что недопустимо (даже если некоторые компиляторы могут его поддерживать) создавать массив stati c (размещается в стеке) double values[n],weights[n]... с размером, неизвестным во время компиляции. Ошибка переполнения стека наиболее вероятна из-за этого (n не известно во время компиляции, и может быть прочитано нежелательное значение, которое нарушает ваш стек). Вместо этого попробуйте разместить их в куче с синтаксисом new double[n]. Не забудьте освободить массив в конце.

...