【问题标题】:Knapsack algorithm for large input大输入的背​​包算法
【发布时间】:2014-06-03 07:41:55
【问题描述】:

我根据维基百科上的伪代码开发了这种背包算法。它适用于少量项目和容量(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;
}

【问题讨论】:

  • 有多慢?为什么会崩溃?它消耗多少内存?
  • 这是基于维基百科上的哪个算法?
  • 不要创建一个指针数组。创建一个数组,并大步访问它,将其视为 2D 集。
  • 这段代码需要检查每次调用 calloc() 的结果以确保它是成功的。对于大量项目,calloc 可能会失败,然后访问该条目,稍后将导致从地址 0 访问内存的错误。

标签: c knapsack-problem


【解决方案1】:

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

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

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

【讨论】:

  • 我通过标准输入读取所有参数。这是我的主要功能。 int main(){ int v; scanf("%d", &amp;v); int *weight; weight = (int *)malloc(sizeof(int)*40); int *value; value = (int *)malloc(sizeof(int)*40); int n = 0; while(2 == scanf("%d %d", &amp;weight[n], &amp;value[n])) { n++; } printf("%d\n", knapSack(v, weight, value, n)); free(weight); free(value); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多