01背包使用单维数组存储中间解决方案

时间:2014-09-29 10:35:00

标签: algorithm dynamic-programming

我已经在线阅读了01背包问题解决方案。当总重量为W时,它们中的每一个都试图存储从0..i和总重量w的子问题选择权重的解决方案。因此,基本上它们需要2D阵列来存储子问题的解决方案。我的问题是他们为什么要解决一组权重的问题,从而增加另一个维度。我发布我的解决方案,迭代所有可用的重量,并建立解决方案,直到背包的重量。这需要仅使用单维数组。我在这里错过了一些东西。我正在粘贴下面的代码。

public class KnapSack01 {

//The Weight Matrix
int[] weight;

//The Benefit Matrix
int[] benefit;

//The size of Knap-Sack
int M;

//array to store solutions to subproblem
//B[i] = optimal solution for capacity i
int[] B;

//Array to print out the chosen weights
String[] chosenWeight;

int calculate() {
    B = new int[M + 1];
    chosenWeight = new String[M + 1];
    for (int i = 0; i < B.length; i++) {
        B[i] = 0;
        chosenWeight[i] = "";
    }
    for (int w = 1; w <= M; w++) {
        for (int i = 0; i < weight.length; i++) {
            int b1 = benefit[i];
            int remaining = w - weight[i];
            int temp = B[w];
            if (remaining >= 0) {
                temp = b1 + B[remaining];
            }
            if (temp >= B[w]) {
                B[w] = temp;
                chosenWeight[w] = chosenWeight[w] + "," + weight[i];
            }
        }
    }
    System.out.println(chosenWeight[M].substring(1,
        chosenWeight[M].length()));
    return B[M];
}

/**
 * @param args
 */
public static void main(String[] args) {
    int[] w = { 2, 3, 4, 5 };
    int[] b = { 3, 4, 5, 6 };
    int capacity = 5;

    KnapSack01 ks = new KnapSack01();
    ks.weight = w;
    ks.benefit = b;
    ks.M = capacity;
    System.out.println(ks.calculate());
}

}

1 个答案:

答案 0 :(得分:1)

您的代码不正确,因为您可以选择相同的项目两次(或更多次) 这是一个例子:

w = {1, 1}  
b = {2, 1}
capacity = 2

正确的答案是3,但你的代码返回4(它选择第一个项目两次)。

实际上可以使用一维数组来实现该算法,但它需要不同的循环次序:
外部循环应迭代项目,内部循环应迭代从W0的权重。