SIGKILL in spoj-LKS

时间:2015-08-24 18:34:58

标签: c runtime-error dynamic-programming knapsack-problem sigkill

提交解决方案时显示运行时错误SIGKILL。我不知道为什么!!!请帮忙...!!我不打算关心TLE,我只是想知道SIGKILL的原因是什么。之后你可以建议我更快更快地解决这个问题的程序。请帮忙,我也一直坚持这个问题很长一段时间,但我找不到运行时错误是怎么来的。 这是我的代码::

#include<stdio.h>

//#define max(a,b) a>b?a:b
int max (int a,int  b){
     if (a>b)
        return a;
     else return b;

}
int V[500];
int W[500];
int F[501][1000001];



int knapsack(int n,int cap){
    if (n==0 || cap==0){
        F[n][cap]=0;
        return 0;
    }
    else if (cap<1000001){
        if (F[n][cap]!=0)
            return F[n][cap];
        else {
            if (W[n-1]>cap){
                 F[n][cap]=knapsack(n-1,cap);
             }
             else {
                 F[n][cap]=max(V[n-1]+knapsack(n-1,cap-W[n-1]),knapsack(n-1,cap));
             }

             return F[n][cap];
        }
    }
    else {
        if (W[n-1]>cap){
            return knapsack(n-1,cap);
            }
        else {
            return max(V[n-1]+knapsack(n-1,cap-W[n-1]),knapsack(n-1,cap));
        }

    }

}

main() {
    int k,n,i;
    scanf("%d %d",&k,&n);

    for (i =0 ;i<n ;i++){
        scanf("%d %d",&V[i],&W[i]);

    }

    printf("%d\n",knapsack(n,k));

 } 

1 个答案:

答案 0 :(得分:0)

SIGKILL的原因是你的阵列F [501] [1000001];

这是因为全局变量是从堆中获得的内存。 现在,Spoj上LKS的内存限制为1536 MB,相当于1.6E9字节。 因为int是4个字节所以int数组的最大大小可以是大约4E8,并且你声明了一个5E8大小的int数组。因此,减少数组大小可以让你摆脱SIGKILL。

要解决这个问题,您需要做的是为dp创建一个2行数组,然后计算答案。

int dp[2][2000001];

我希望这会有所帮助。 :)