import java.util.LinkedList;
public class Knapsack {
public static void stealObjects(int packCapacity, Item[] items, int curItemIndex, int[] path, LinkedList<Item> objectsStolen) {
if (curItemIndex == items.length) {
objectsStolen.clear();
for (int index = 0; index < path.length; ++index) {
if (path[index] > 0) {
objectsStolen.add(items[index]);
}
}
return;
}
int maxValue = 0;
for (int i = 0; i < objectsStolen.size(); ++i) {
maxValue += objectsStolen.get(i).value;
}
int curValue = 0;
int curWeight = 0;
for (int i = 0; i < curItemIndex; ++i) {
if (path[i] > 0) {
curValue += items[i].value;
curWeight += items[i].weight;
}
}
if (items[curItemIndex].weight <= packCapacity - curWeight) {
path[curItemIndex] = 1;
int upperValue = curValue + items[curItemIndex].value;
if (curItemIndex < items.length - 1) {
Item nextItem = items[curItemIndex + 1];
upperValue += (packCapacity - curWeight - items[curItemIndex].weight) * (nextItem.value / nextItem.weight);
}
if (upperValue > maxValue) {
stealObjects(packCapacity, items, curItemIndex + 1, path, objectsStolen);
}
}
path[curItemIndex] = 0;
maxValue = 0;
for (int i = 0; i < objectsStolen.size(); ++i) {
maxValue += objectsStolen.get(i).value;
}
int upperValue = curValue;
if (curItemIndex < items.length - 1) {
Item nextItem = items[curItemIndex + 1];
upperValue += (packCapacity - curWeight) * (nextItem.value / nextItem.weight);
}
if (upperValue > maxValue) {
stealObjects(packCapacity, items, curItemIndex + 1, path, objectsStolen);
}
}
public static void main(String[] args) {
Item[] items = {
new Item(3000, 4),
new Item(2000, 3),
new Item(1500, 1)
};
int packCapacity = 4;
int[] path = new int[items.length];
LinkedList<Item> objectsStolen = new LinkedList<>();
stealObjects(packCapacity, items, 0, path, objectsStolen);
int totalValue = 0;
for (Item item : objectsStolen) {
System.out.println("Stolen: " + item);
totalValue += item.value;
}
System.out.println("Total Value: " + totalValue);
}
}
class Item {
int value;
int weight;
public Item(int value, int weight) {
this.value = value;
this.weight = weight;
}
@Override
public String toString() {
return "Value: " + value + ", Weight: " + weight;
}
}