Грешка в сегментирането в 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
Сигурни ли сте, че можете да (м)разпределите 4GB памет?   -  person Aki Suihkonen    schedule 04.01.2013
comment
@sgar91 Въпросът е с етикет C, а официалният C стандарт вече е C11. C89 е мъртъв, но не е забравен. :)   -  person ams    schedule 04.01.2013


Отговори (1)


Когато разпределяте масивите за второто измерение, вие правите:

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ти елемент.

Така че основно - трябва да промените инициализацията на второто измерение на:

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