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