如果我像这样实施0-1背包,那么时间的复杂性是多少?

时间:2015-08-04 20:59:48

标签: algorithm

所以,这里是问题链接http://www.geeksforgeeks.org/dynamic-programming-set-10-0-1-knapsack-problem/,现在他们给出了两个解决方案,一个使用递归,一个使用DP。在尝试自己实现它时,我使用以下方法实现了DP解决方案:

int knapSack(int W, int wt[], int val[], int n, int matrix[][100])
{
   // Base Case
   if (n == 0 || W == 0)
       return 0;
   if (matrix[n][W] != 0)
       return matrix[n][W];

   // If weight of the nth item is more than Knapsack capacity W, then
   // this item cannot be included in the optimal solution
   else if (wt[n-1] > W)
   { 
        matrix[n][W] = knapSack(W, wt, val, n-1,matrix);
        return matrix[n][W];
   }
   // Return the maximum of two cases: (1) nth item included (2) not included
   else
   {
        matrix[n][W] = max( val[n-1] + knapSack(W-wt[n-1], wt, val, n-1,matrix),
                    knapSack(W, wt, val, n-1,matrix));
        return matrix[n][W];
   }
}

虽然上面的跑步方法给出了正确答案,但我只是想知道这个方法是否相当于链接本身给出的方法,或者与他们相比,我的花费更多时间? 谢谢!

1 个答案:

答案 0 :(得分:1)

你的方法很好。你正在做的是memoization,你可以在得到答案后保存答案,然后在需要时再回复它们,而无需重新计算答案。

你的解决方案确实遭受了递归的开销,这可能会使它比迭代版本略慢,但它不应该是明显的。

基本上:

  1. 你的方法比递归方法快得多,无论是渐近还是在实践中。

  2. 您的方法可能比它们的迭代实现稍慢,但对于您可以负担得起内存和运行两者的时间,它可能甚至都不明显。渐近地,您的实现与其迭代实现相同。