programming-examples/java/Numerical_Problems/Knapsack.java

57 lines
1.6 KiB
Java
Raw Normal View History

2019-11-15 12:59:38 +01:00
package com.jwetherell.algorithms.mathematics;
import java.util.ArrayList;
import java.util.List;
public class Knapsack {
public static final int[] zeroOneKnapsack(int[] values, int[] weights, int capacity) {
if (weights.length != values.length)
return null;
int height = weights.length + 1; // weights==values
int width = capacity + 1;
int[][] output = new int[height][width];
for (int i = 1; i < height; i++) {
int index = i - 1;
for (int j = 1; j < width; j++) {
if (i == 0 || j == 0) {
output[i][j] = 0;
} else {
if (weights[index] > j) {
output[i][j] = output[i - 1][j];
} else {
int v = values[index] + output[i - 1][j - weights[index]];
output[i][j] = Math.max(output[i - 1][j], v);
}
}
}
}
List<Integer> list = new ArrayList<Integer>();
int i = height - 1;
int j = width - 1;
while (i != 0 || j != 0) {
int current = output[i][j];
int above = output[i - 1][j];
if (current == above) {
i -= 1;
} else {
i -= 1;
j -= weights[i];
list.add(i);
}
}
int count = 0;
int[] result = new int[list.size()];
for (Object obj : list.toArray()) {
if (obj instanceof Integer)
result[count++] = (Integer) obj;
}
return result;
}
}