Java中背包问题的递归求解

Java中背包问题的递归求解,java,recursion,knapsack-problem,Java,Recursion,Knapsack Problem,背包问题给出了递归解,但我不能理解它。为什么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)

背包问题给出了递归解,但我不能理解它。为什么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)
                  );
}

重量不能变为负数。只有当当前项目的重量小于或等于剩余总重量时,才会减去当前项目的重量。

重量不能为负数。只有当当前项的权重小于或等于总剩余权重时,才会减去当前项的权重。

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

if (wt[n-1] > W)
       return knapSack(W, wt, val, n-1);
如上所述,如果新重量大于剩余重量,我们不通过将
n
的值减少
1
来包含它。如果它比W小,我们会退还Max的背包,包括和不包括它

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

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

if (wt[n-1] > W)
       return knapSack(W, wt, val, n-1);
如上所述,如果新重量大于剩余重量,我们不通过将
n
的值减少
1
来包含它。如果它比W小,我们会退还Max的背包,包括和不包括它

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