微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优化递归算法,其复杂度为2 ^ n

如何解决优化递归算法,其复杂度为2 ^ n

我发现了以下问题:假设我有N个苹果树的字段,每个字段上都带有A i 苹果。我也有M个购物篮,每个购物篮的属性C i 用于容纳容量,而F i 用于灵活性。当我要采摘苹果树时,我只能按从1到N的顺序从树中采摘。在每棵树上,我有两个选择,可以采摘树上的所有苹果或扩大篮子以使其容量增加F 。当我展开篮子时,我无法在那棵树上摘水果。找出每个篮子可以采摘的苹果的最大数量

示例:

N = 5; A = [3,2,4,7,5]

M = 2; (C,F)= [(5,3),(3,6)]

答案: 对于第一个篮子,最多可获取12个苹果:

  1. 将袋子扩大3(最大容量= 5 + 3 = 8)
  2. 将袋子扩大3(最大容量= 8 + 3 = 11)
  3. 将袋子扩大3(最大容量= 11 + 3 = 14)
  4. 摘第4棵树(得到7个苹果,当前总数= 7)
  5. 摘第5棵树(得到5个苹果,当前总数= 12)

第二个行李最大为15:

  1. 摘第1棵树(得到3个苹果,当前总数= 3)
  2. 将袋子扩大6(最大容量= 3 + 6 = 9)
  3. 将袋子扩大6(最大容量= 9 + 6 = 15)
  4. 摘第4棵树(获得7个苹果,当前总数= 10)
  5. 摘第5棵树(得到5个苹果,当前总数= 15)

我已经在另一个SO问题上问过了,得到了这段代码

class Main {

  private static Map<String,Integer> cache = new HashMap<>();
  static int[] trees = new int[]{3,2,4,7,5};

  public static int maxApples(int treeNum,int capacityLeft,int basketFlex) {

    if (cache.containsKey(treenum+"_"+capacityLeft+"_"+basketFlex)) {
       return cache.get(treenum+"_"+capacityLeft+"_"+basketFlex);
    }

    if (treeNum >= trees.length) {
      cache.put(treenum+"_"+capacityLeft+"_"+basketFlex,0);
      return 0;
    }

    int pick = 0;
    if (trees[treeNum] <= capacityLeft) {
      pick = trees[treeNum] + maxApples(treeNum+1,capacityLeft - trees[treeNum]);
    }
    int expand = maxApples(treeNum+1,capacityLeft + basketFlex);

    cache.put(treenum+"_"+capacityLeft+"_"+basketFlex,Math.max(pick,expand));
    return Math.max(pick,expand);
  }
}

问题是,我必须在3秒钟内计算出最多24300个带有100棵树的篮子。即使进行了更多优化,该代码也无法实现。我总是会因为hashmap或TLE出现内存限制错误。 (灵活性和容量以及苹果/树的界限都是一百万)

我应该如何优化该算法?

(此问题的续篇:Apple Picking Optimization Algorithm

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。