这个算法实现0 1背包的复杂性是多少?

时间:2016-01-09 14:27:06

标签: c knapsack-problem

在代码的递归版本中,我使用查找表来避免重新计算。但我无法弄清楚它是否比自下而上的方法更好。所以它更好吗?并且我尝试用n = 20求解并且它没有给出堆栈溢出错误。那么,这种方法很好吗?而且如果我尝试在相同的代码中使用W = 90并且所有其他输入保持相同(如下面的代码中所示),我会得到一些垃圾值作为答案,为什么?
我知道用最大值全局声明数组并不是好方法(浪费内存)。我可以在大小为n x W + 1的动态主函数中声明它,我试过了。但是当我试图在函数中传递它时(Dev-C ++)给了我一个警告,从不兼容的指针类型传递arg并首先忽略警告并运行程序我在输出中什么都没有。可能是什么原因。 PS:我是初学者,非常感谢。

  #include<stdio.h>
  #define MAXN 20
  #define MAXW 100

  int look[MAXN][MAXW];

  int max(int a, int b){
         return (a > b)? a : b; 
  }


 int knapSack(int W, int wt[], int val[], int n){

      if (n == -1 || W == 0)
          return 0;
      if(look[n][W]!=-1)
          return look[n][W];

      if (wt[n] > W){
          look[n-1][W]=knapSack(W, wt, val, n-1);
          look[n][W]=look[n-1][W];
      }

      else   
           look[n][W]=max( val[n] + knapSack(W-wt[n], wt, val, n-1),knapSack(W, wt, val, n-1));

      return look[n][W];
  }

  int main(){

      int val[] = {7,4,5,1};
      int wt[] = {5,4,3,1};
      int i,j,W = 7;
      int n = sizeof(val)/sizeof(val[0]);

      for(i=0;i<n;i++)
          for(j=0;j<=W;j++)look[i][j]=-1; 
              printf("%d", knapSack(W, wt, val, n-1));
      return 0;
 }

1 个答案:

答案 0 :(得分:0)

  

我得到一些垃圾值作为答案,为什么?

查看函数knapSack()中的初始语句:

      if(look[n][W]!=-1)
          return look[n][W];
      if (n == -1 || W == 0)
          return 0;

函数可以通过递归来调用,n为-1,你可以在第二个if语句中使用,但是为时已晚,因为在第一个if条件下你已经访问未定义的值look[-1][W]。您可能想要颠倒这两个陈述的顺序。