用于大输入的背​​包算法

时间:2014-06-02 22:36:41

标签: c knapsack-problem

我开发了这种基于维基百科上的伪代码的背包算法。它适用于少量项目和容量(n = 6,v = 2014),但是对于大数字(n = 5,v = 123456789)它会崩溃。

另外一个问题是,我的程序是由makefile测试的,时间限制设置为1秒。

我可以做些什么来节省时间和记忆?

v - 背包容量
n - 项目数量
重量[] - 重量
值[] - 值

int knapSack(int v, int weight[], int value[], int n){
    int a, i, j;

    int **ks;
    ks = (int **)calloc(n+1, sizeof(int*));

    for(a = 0; a < (n+1); a++) {
        ks[a] = (int *)calloc(v+1, sizeof(int));
    }

    for (i = 1; i <= n; i++){
        for (j = 0; j <= v; j++){
            if (weight[i-1] <= j){
                ks[i][j] = max(value[i-1] + ks[i-1][j-weight[i-1]],  ks[i-1][j]);
            } else {
                ks[i][j] = ks[i-1][j];
            }
        }
    }

    int result = ks[n][v];

    for(i = 0; i < (n+1); i++) {
        free(ks[i]);
    }
    free(ks);

    return result;
}

1 个答案:

答案 0 :(得分:1)

在堆栈上声明的123456789个整数元素的数组将使C的许多实现崩溃。听起来这是你的问题。你是否在函数内部(在堆栈上)声明了数组?

// on heap
static int v[123456789]={0};

// on the stack (inside a function like main() )
int foo()
{
  int v[123456789]={0};
}