c - 只有某些输入的 C 中的段错误

标签 c algorithm data-structures malloc knapsack-problem

好的,我正在尝试解决背包问题。

在小输入情况下,程序运行没有问题并提供最佳解决方案,但是当输入大小很大,或者输入文件中的数字变大时,程序会给我一个段错误。我不太明白为什么会这样,因为 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 感谢您的帮助!

最佳答案

在为二维分配数组时:

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 分配数组第一项。

所以基本上 - 您需要将 2nd 维度的初始化更改为:

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

关于c - 只有某些输入的 C 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14155090/

相关文章:

c - 第二个 shmget 总是返回拒绝访问

python - 刷新装饰器

c++ - 如果映射包含指针,如何清除映射中的内存?

c++ - 寻找子树的空间复杂度

c++ - 我们可以使用 'malloced' 释放 'delete' 内存吗?

C - 计算文件中的单词、字符和行数。字符数

c - 可移植软快速C IDE

python - 有没有更快的方法来做到这一点? (python 推特位置)

c# - 查找年日期的 dd/mm 格式的算法?

c - memcpy 使用本地指针指向全局数据