Ошибка сегментации в C только с определенными входами

Итак, я пытаюсь решить проблему с рюкзаком.

В случае небольших входных данных программа работает без проблем и обеспечивает оптимальное решение, однако, когда размер входных данных велик или, скорее, числа во входном файле становятся большими, программа выдает ошибку сегментации. Я не совсем понимаю, почему это происходит, поскольку максимальное значение INT также превышает любое из этих чисел.

Вот мой код.

    #include<stdio.h>
    #include<stdlib.h>
    int main(void)
    {
        int W,n,i,j,k ;
        scanf("%d %d",&W,&n); // capacity of knapsack and number of total items
        int value[n+1],weight[n+1];
        int** A;
        A = (int **)malloc((n+1)*sizeof(int*));
        for(i=0;i<W+1;i++)
            A[i]=(int *)malloc(sizeof(int)*(W+1));
        for(i=1;i<n+1;i++)
        {
            scanf("%d %d",&value[i],&weight[i]); //taking value and weight of each item
        }
        for(i=0;i<W+1;i++)
            A[0][i]=0;
        for(i=0;i<n+1;i++)
            A[i][0]=0;
        for(i=1;i<n+1;i++)
        {   
            for(j=1;j<W+1;j++)
            {
                if(j-weight[i]<0)
                {
                    A[1][j]=A[0][j];
                }
                else
                {
                    if(A[0][j]>A[0][j-weight[i]]+value[i])
                        A[1][j]=A[0][j];
                    else
                        A[1][j]=A[0][j-weight[i]]+value[i];
                }
            }
            for(k=0;k<W+1;k++)
                A[0][k]=A[1][k];
        }   
        int max=0;
        i=1;
        for(i=0;i<2;i++)
            for(j=0;j<W+1;j++)
            {
                if(A[i][j]>max)
                    max=A[i][j];
            }
        printf("%d\n",max);
        return(0);
    }

Он отлично работает для этого ввода http://spark-public.s3.amazonaws.com/algo2/datasets/knapsack1.txt

Но когда размер ввода указан в ссылке, возникает ошибка сегмента http://spark-public.s3.amazonaws.com/algo2/datasets/knapsack2.txt Спасибо за помощь!


person Ole Gooner    schedule 04.01.2013    source источник
comment
Вы можете скомпилировать свою программу с символами отладки и подключить отладчик. Он скажет вам, где именно ваша программа ошибается.   -  person Sjoerd    schedule 04.01.2013
comment
Как вы это делаете? int value[n+1],weight[n+1]; Это даже не должно компилироваться.   -  person sgarizvi    schedule 04.01.2013
comment
@ sgar91, который выглядит как вполне допустимый C99. Вытащите себя из восьмидесятых!   -  person ams    schedule 04.01.2013
comment
Я пытался использовать gdb в течение нескольких часов. Никакой помощи оттуда.   -  person Ole Gooner    schedule 04.01.2013
comment
@ams... На самом деле я использую C++. Также вопрос не помечен C99 и не упоминается в вопросе.   -  person sgarizvi    schedule 04.01.2013
comment
Не приводить возврат malloc   -  person Eregrith    schedule 04.01.2013
comment
Вы уверены, что можете (m) выделить 4 ГБ памяти?   -  person Aki Suihkonen    schedule 04.01.2013
comment
@sgar91 Вопрос помечен помечен как C, а официальным стандартом C теперь является C11. C89 мертв, но не забыт. :)   -  person ams    schedule 04.01.2013


Ответы (1)


При распределении массивов для 2-го измерения вы делаете:

for(i=0;i<W+1;i++)
     A[i]=(int *)malloc(sizeof(int)*(W+1));

В цикле должно быть n+1 вместо W+1. Вы должны перебирать измерения «предметов» и выделять измерение «вес».

Решение отлично работает для n <= W, но для большего количества элементов (W < n) вы получите неопределенное поведение, потому что в какой-то момент вы пытаетесь получить доступ к A[n][0], но не выделили массив для n элемент.

Итак, в основном - вам нужно изменить инициализацию 2-го измерения на:

for(i=0;i<n+1;i++)
     A[i]=(int *)malloc(sizeof(int)*(W+1));
person amit    schedule 04.01.2013