首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

用c语言实现的0-1背包算法 有点有关问题 大家帮忙看看 多谢

2012-03-09 
用c语言实现的0-1背包算法 有点问题 大家帮忙看看 谢谢KNAPSACK.h#ifndef_KNAPSACK_H#define_KNAPSACK_H#i

用c语言实现的0-1背包算法 有点问题 大家帮忙看看 谢谢
KNAPSACK.h

#ifndef _KNAPSACK_H
#define _KNAPSACK_H
#include <stdlib.h>
int* knaspack(int* w,int* v,int c,int n){
  int i,j,**m,*x;
 // m=(int*)malloc((n+1)*(c+1)*sizeof(int));
  x=(int*)malloc(n*sizeof(int));
  m=(int**)malloc((n+1)*sizeof(int*));
  for(i=0;i<=n;i++)
m[i]=(int*)((c+1)*sizeof(int));
  for(i=0;i<=n;i++)
m[i][0]=0;
  for(j=1;j<=c;j++)
m[0][j]=0;
  for(i=1;i<=n;i++)
for(j=1;j<=c;j++){
if(w[i-1]>j)
m[i][j]=m[i-1][j];
else if(m[i-1][j]>=m[i-1][j-w[i-1]]+v[i-1])
m[i][j]=m[i-1][j];
else m[i][j]=m[i-1][j-w[i-1]]+v[i-1];
}
j=c;
for(i=n;i>=1;i--){
if(m[i-1][j]==m[i][j])
x[i-1]=0;
else {
x[i-1]=1;
j=j-w[i-1];
}
}
return x;
}
#endif

test.cpp
#include "KNAPSACK.h"
#include <stdio.h>
int main(){
int w[5]={3,4,7,8,9},v[5]={4,5,10,11,13},c=19,*p,i;

p=knaspack(w,v,c,5); 
for(i=0;i<5;i++)
printf("%d ",p[i]);
return 0;
 
}

在调试的时候,分布执行到
for(i=0;i<=n;i++)
m[i][0]=0;
是 出现了未处理的“System.NullReferenceException”类型的异常出现在 BACKPACK.exe 中。

其他信息: 未将对象引用设置到对象的实例。的问题 但是我已经将m分配了空间了啊 为什么回报这样的错啊? 




[解决办法]
越界、
[解决办法]
看没有注释的代码,很痛苦
[解决办法]
哦 您的那个问题不止上面那个。。。
看了下你的knaspack函数代码
int* knaspack(int* w,int* v,int c,int n){
int i,j,**m,*x;
 // m=(int*)malloc((n+1)*(c+1)*sizeof(int));
x=(int*)malloc(n*sizeof(int));
m=(int**)malloc((n+1)*sizeof(int*));
for(i=0;i<=n;i++)
m[i]=(int*)((c+1)*sizeof(int));
for(i=0;i<=n;i++)
m[i][0]=0;
for(j=1;j<=c;j++)
m[0][j]=0;

注意红字部分 m越界了 你的for循环是 i<=n,i=n时越界了

热点排行