我已经在线阅读了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());
}
}
答案 0 :(得分:1)
您的代码不正确,因为您可以选择相同的项目两次(或更多次) 这是一个例子:
w = {1, 1}
b = {2, 1}
capacity = 2
正确的答案是3,但你的代码返回4(它选择第一个项目两次)。
实际上可以使用一维数组来实现该算法,但它需要不同的循环次序:
外部循环应迭代项目,内部循环应迭代从W
到0
的权重。