提交解决方案时显示运行时错误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));
}
答案 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];
我希望这会有所帮助。 :)