栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何递归解决“经典”背包算法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何递归解决“经典”背包算法?

你尝试了什么?

考虑到您陈述的问题(指定必须使用递归),这个想法很简单:对于您可以接受的每个项目,看看是否更好。因此,只有两种可能的路径:

  1. 你拿这个东西
  2. 你不接受

拿走物品时,将其从列表中删除,并通过物品的重量减少容量。

如果您不拿走物品,则从列表中删除if,但不会减少容量。

有时,它有助于打印递归调用的外观。在这种情况下,它可能看起来像这样:

Calling 11 8 7 6 5  with cap: 20 +Calling 8 7 6 5  with cap: 20 |  Calling 7 6 5  with cap: 20 |    Calling 6 5  with cap: 20 |      Calling 5  with cap: 20 |      Result: 5 |      Calling 5  with cap: 14 |      Result: 5 |    Result: 11 |    Calling 6 5  with cap: 13 |      Calling 5  with cap: 13 |      Result: 5 |      Calling 5  with cap: 7 |      Result: 5 |    Result: 11 |  Result: 18 |  Calling 7 6 5  with cap: 12 |    Calling 6 5  with cap: 12 |      Calling 5  with cap: 12 |      Result: 5 |      Calling 5  with cap: 6 |      Result: 5 |    Result: 11 |    Calling 6 5  with cap: 5 |      Calling 5  with cap: 5 |      Result: 5 |    Result: 5 |  Result: 12 +Result: 20  Calling 8 7 6 5  with cap: 9    Calling 7 6 5  with cap: 9      Calling 6 5  with cap: 9        Calling 5  with cap: 9        Result: 5        Calling 5  with cap: 3        Result: 0      Result: 6      Calling 6 5  with cap: 2        Calling 5  with cap: 2        Result: 0      Result: 0    Result: 7    Calling 7 6 5  with cap: 1      Calling 6 5  with cap: 1        Calling 5  with cap: 1        Result: 0      Result: 0    Result: 0  Result: 8Result: 20

我确实故意显示了对[8 7 6 5]的调用,其容量为20,结果为20(8 + 7 + 5)。

请注意,[8 7 6 5]被调用了两次:一次容量为20(因为我们没有取11),一次容量为9(因为我们取了11)。

因此,解决方案的路径:

11未取,呼叫[8 7 6 5],容量为20

取8,呼叫[7 6 5],容量为12(20-8)

取7,以5(12-7)的容量跟注[6 5]

6未取,以5的容量跟注[5]

摄5,我们为零。

Java中的实际方法几乎可以包含几行代码。

由于这显然是家庭作业,因此我将为您提供帮助:

private int ukp( final int[] ar, final int cap ) {    if ( ar.length == 1 ) {        return ar[0] <= cap ? ar[0] : 0;    } else {        final int[] nar = new int[ar.length-1];        System.arraycopy(ar, 1, nar, 0, nar.length);        fint int item = ar[0];        if ( item < cap ) { final int left = ...  // fill me: we're not taking the item final int took = ...  // fill me: we're taking the item return Math.max(took,left);        } else { return ... // fill me: we're not taking the item        }    }}

我确实将数组复制到了一个效率较低的新数组中(但是无论如何,如果您寻求性能,递归都不是这里的方法),而是更多的“功能性”。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/617048.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号