如何在背包中找到元素(扭曲 - 需要所有获取元素的方法)

时间:2014-09-19 13:18:41

标签: algorithm dynamic-programming knapsack-problem

这是我使用动态编程方法解决的经典背包问题。

here后,我创建了一种类似的方法来确定构成背包的元素类型。我需要找出最终答案的所有方法,而不仅仅是一种方式。我怎样才能做到这一点?

目前,我只能向后工作以找到我的项目添加到最大值的一种方式。但在我的输入中,我可能有两种或更多种方式将项目添加到最大值。我想知道这两种或更多种方式,因为我必须根据某些标准选择一组最佳项目。我怎样才能做到这一点?我应该使用我的DP矩阵或下面的代码吗?

  

e.g。输入

     

约束:

     

maxWeight = 100

     

i.d./ value / weight

     

1/50/40

     

2/40/30

     

3/30/40

     

4/50/40

     

输出:基于约束,我可以有1,2,3或2,3,4

     

两者加起来相同的分数和重量。我怎样才能确定两者   套?

前奏:

  

我正在确定该项目在arraylist中的时间属性是否下降   在一定限度内。我已经创建了一个bool数组(wasTaken)   背包方法我放入了本来可以使用的元素   拍摄。在这里,我遍历我的矩阵以确定采取了哪个元素,   然后将项目的id存储在打印(排序后)之后。 INT [] []   下面的sol表示动态编程中填充的矩阵   先前方法的风格。 i值表示项目和权重   值表示正在考虑的权重。这已经完成了   方式类似于this链接。

我目前的代码:

public static void findElements(boolean[][] wasTaken, int maxWeight, ArrayList<Nodes> items, int[][] sol, int currentTime, int limit) {
        int K = maxWeight;
        int n = items.size();
        int count = 0;
        int[] forPrint = new int[n];
        for (int i = n-1; i>=0; i--) {
            if (wasTaken[i][K] == true && (currentTime - items.get(i).time <= limit)) {
                forPrint[i] = items.get(i).index;
                count++;
                K = K - items.get(i).height;

            }
        }
        Arrays.sort(forPrint);
        showResult(count, forPrint);
    }

1 个答案:

答案 0 :(得分:0)

对于从j1的{​​{1}},让n为项p[j]的利润,让j为权重。对于从w[j]j的{​​{1}}和从0n的{​​{1}}到权重限制,让W成为从总重量0不大于opt[j][W]。在计算1..j时,我们有重复发生

W

为了枚举所有最佳解决方案,我们以递归和深度优先的方式工作。给定optopt[j][W] = max(p[j] + opt[j - 1][W - w[j]], opt[j - 1][W]) if j > 0 and W ≥ 0, ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^ item j chosen item j not chosen 0 if j = 0 and W ≥ 0, -infinity (i.e., infeasible) if W < 0. ,如果这是基本情况,则生成当前所选项目集(如果j)或根本不产生任何内容(如果W)。否则,将W ≥ 0与max的两个参数进行比较。如果它等于第一个参数,则为W < 0opt[j][W]生成所有解决方案,并将项j - 1添加到所选项集。如果W - w[j]等于第二个参数,则为jopt[j][W]生成所有解。我们可以产生多个解决方案,因为两个参数可能相等。