所以,这里是问题链接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];
}
}
虽然上面的跑步方法给出了正确答案,但我只是想知道这个方法是否相当于链接本身给出的方法,或者与他们相比,我的花费更多时间? 谢谢!
答案 0 :(得分:1)
你的方法很好。你正在做的是memoization,你可以在得到答案后保存答案,然后在需要时再回复它们,而无需重新计算答案。
你的解决方案确实遭受了递归的开销,这可能会使它比迭代版本略慢,但它不应该是明显的。
基本上:
你的方法比递归方法快得多,无论是渐近还是在实践中。
您的方法可能比它们的迭代实现稍慢,但对于您可以负担得起内存和运行两者的时间,它可能甚至都不明显。渐近地,您的实现与其迭代实现相同。