Java中Knapsack的递归解决方案

时间:2015-01-16 22:36:04

标签: java recursion knapsack-problem

针对背包问题给出了

HERE递归解决方案,但我无法理解它。为什么没有检查W?如果W(剩余重量)低于0,我们不会回来吗?在特定的递归调用中前进一步的重点是W是否已经小于0?

// Returns the maximum value that can be put in a knapsack of capacity W
int knapSack(int W, int wt[], int val[], int n)
{
   // Base Case
   if (n == 0 || W == 0)
       return 0;

   // If weight of the nth item is more than Knapsack capacity W, then
   // this item cannot be included in the optimal solution
   if (wt[n-1] > W)
       return knapSack(W, wt, val, n-1);

   // Return the maximum of two cases: (1) nth item included (2) not included
   else return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n-1),
                    knapSack(W, wt, val, n-1)
                  );
}

2 个答案:

答案 0 :(得分:3)

请注意,W的每个递归调用值也会更新。只有当它小于W时,我们才会从剩余的重量W中减去一个新的重量。否则不能包括该重量。这个逻辑在这里被捕获

if (wt[n-1] > W)
       return knapSack(W, wt, val, n-1);

如上所示,如果新的权重超过剩余,我们不会通过n减少1的值来包含它。如果它小于W,我们会返回Max of Knapsack,包括但不包括它。

return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n-1),
                    knapSack(W, wt, val, n-1)

答案 1 :(得分:2)

重量不能变成负数。仅当当前项目的重量小于或等于总剩余重量时,才减去当前项目的权重。