【发布时间】: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