Java 递归装箱算法赢得';t刻度
我完成了一项任务,其规格要求:Java 递归装箱算法赢得';t刻度,java,algorithm,data-structures,recursion,stack-overflow,Java,Algorithm,Data Structures,Recursion,Stack Overflow,我完成了一项任务,其规格要求: 递归解 容量箱子包装问题的关键启发是总是先包装最笨拙(最大)的物品。例如,如果你正在打包一辆正在移动的卡车,你先把钢琴放进去,然后再担心更小的东西。这样做的目的是最大限度地提高你的灵活性 另一种技术是我称之为“括号”。假设您正在寻找两个总和为50的数字,您有一个类似{2,3,9,18,24,29,37,45}的列表。不必检查每个组合,因为不能有两个值大于25或小于25。您只需检查列表两侧的数字,即45+2、45+3、45+9、停止、下一个数字、37+2、37+3
- 递归解
- 容量箱子包装问题的关键启发是总是先包装最笨拙(最大)的物品。例如,如果你正在打包一辆正在移动的卡车,你先把钢琴放进去,然后再担心更小的东西。这样做的目的是最大限度地提高你的灵活性
另一种技术是我称之为“括号”。假设您正在寻找两个总和为50的数字,您有一个类似{2,3,9,18,24,29,37,45}的列表。不必检查每个组合,因为不能有两个值大于25或小于25。您只需检查列表两侧的数字,即45+2、45+3、45+9、停止、下一个数字、37+2、37+3等。这是括号。通过创建一组规则并围绕平均值括起来,您只需要检查一小部分可能的组合
装箱是一个搜索问题,因为在许多情况下,您无法枚举所有可能的组合。就像下棋一样;你不可能计算出每一个可能的移动,你只是在试图找到一个好的移动。我建议阅读关于动态规划和记忆的书籍public void calculateCombinations(int capacity, int index) { count++; if(index < values.length) { if(values[index] <= capacity) { currentSolution.addLast(index); if(values[index] == capacity) flushSolution(); else capacity -= values[index]; } calculateCombinations(capacity, index + 1); } else if(currentSolution.peekLast() != null) calculateCombinations(capacity + values[currentSolution.peekLast()], currentSolution.removeLast() + 1); }