如何解决优化递归算法,其复杂度为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)]
- 将袋子扩大3(最大容量= 5 + 3 = 8)
- 将袋子扩大3(最大容量= 8 + 3 = 11)
- 将袋子扩大3(最大容量= 11 + 3 = 14)
- 摘第4棵树(得到7个苹果,当前总数= 7)
- 摘第5棵树(得到5个苹果,当前总数= 12)
第二个行李最大为15:
- 摘第1棵树(得到3个苹果,当前总数= 3)
- 将袋子扩大6(最大容量= 3 + 6 = 9)
- 将袋子扩大6(最大容量= 9 + 6 = 15)
- 摘第4棵树(获得7个苹果,当前总数= 10)
- 摘第5棵树(得到5个苹果,当前总数= 15)
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 举报,一经查实,本站将立刻删除。