Java中背包的递归解决方案

Posted

技术标签:

【中文标题】Java中背包的递归解决方案【英文标题】:Recursive solution for Knapsack in Java 【发布时间】:2015-01-16 22:36:03 【问题描述】:

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)
                  );

【问题讨论】:

【参考方案1】:

请注意,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)

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Java中背包的递归解决方案的主要内容,如果未能解决你的问题,请参考以下文章

在C中递归解决背包问题的麻烦

我的背包递归解决方案可以改进吗?

背包问题变体的递归关系?

c++ - 如何在递归中使用记忆来解决0-1背包问题而没有运行时错误以在c ++中进行较大的输入?

Java递归版01背包

01背包问题的多种解法