java - 在 0/1 KnapSack 中打印结果(递归蛮力)

标签 java recursion knapsack-problem

public static int KnapSack(int capacity, Item[] items, int numItems) {
    if (numItems == 0 || capacity == 0)
        return 0;
    if (items[numItems-1].weight > capacity)
        return KnapSack(capacity, items, numItems-1);
    else {
        int took = items[numItems-1].value + KnapSack(capacity - items[numItems-1].weight, items, numItems-1);
        int left = KnapSack(capacity, items, numItems-1);
        return Math.max(took, left);
    }     
}  

所以我有一个有效的 0/1 递归蛮力算法来解决 KnapSack 问题。我想知道打印出工作解决方案的方法是什么(即从项目集中收集到背包中的项目)。我已经尝试了很多事情,例如添加到列表中并尝试跟踪我添加的内容,但都没有解决实现或设计问题。所以我来这里寻求帮助,谢谢!

最佳答案

要跟踪拿走的元素,请尝试以下方法:

public static int KnapSack(int capacity, Item[] items, int numItems, ArrayList<Integer> taken) {
    if (numItems == 0 || capacity == 0)
        return 0;
    if (items[numItems-1].weight > capacity)
        return KnapSack(capacity, items, numItems-1, taken);
    else {
        final int preTookSize = taken.size();
        final int took = items[numItems-1].value + KnapSack(capacity - items[numItems-1].weight, items, numItems-1, taken);

        final int preLeftSize = taken.size();
        final int left = KnapSack(capacity, items, numItems-1, taken);

        if (took > left) {
            if (taken.size() > preLeftSize)
                taken.removeRange(preLeftSize, taken.size());
            taken.add(Integer.valueOf(numItems - 1));
            return took;
        }
        else {
            if (preLeftSize > preTookSize)
                taken.removeRange(preTookSize, preLeftSize);
            return left;
        }
    }     
}

这可能不是最有效的,但我认为它应该有效。

(为了提高效率,您可以尝试将获取的 ArrayList 预先分配为“足够大”,以便在递归循环期间不需要进行任何分配。)

关于java - 在 0/1 KnapSack 中打印结果(递归蛮力),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342386/

相关文章:

python - 集合中加权元素的组合,其中加权和等于固定整数(在Python中)

java - 将 Apache HttpComponents 用于 https 请求 : "peer not authenticated" and "handshake_failure" errors

java - 如何在openNLP chunker中识别PP-tags/NP-tags/VP-tags?

java - 按下按钮时清除编辑文本

javascript - javascript 中的闭包,对 sum 函数进行多次空调用

c++ - 编写一个返回堆栈的函数,该堆栈包含小于给定数字的所有元素,并且顺序相同?

algorithm - 背包 0-1 数量固定

3d - 将许多小长方体打包成给定的大长方体

java - 如何明智地构建Maven项目包?

c - 为什么我的递归函数的返回值出错