import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
class Item {
public String name;
public int value;
public int weight;
public double ratio;
Item(String name, int value, int weight) {
this.name = name;
this.value = value;
this.weight = weight;
this.ratio = (double) value / weight;
}
public double getRatio() {
return ratio;
}
static int maxValue = 0;
static LinkedList<Item> bestSolution = new LinkedList<>();
public static void stealObjects(int packCapacity, Item[] items, int curItemIndex, int[] path, LinkedList<Item> objectsStolen, int curWeight, int curValue) {
if (curItemIndex == items.length) {
if (curValue > maxValue) {
bestSolution.clear();
bestSolution.addAll(objectsStolen);
maxValue = curValue;
}
return;
}
int upperValue = curValue;
int remainingCapacity = packCapacity - curWeight;
for (int i = curItemIndex; i < items.length; i++) {
if (items[i].weight <= remainingCapacity) {
upperValue += items[i].value;
remainingCapacity -= items[i].weight;
} else {
upperValue += (remainingCapacity / items[i].weight) * items[i].value;
break;
}
}
if (upperValue <= maxValue) {
return;
}
if (items[curItemIndex].weight <= packCapacity - curWeight) {
path[curItemIndex] = 1;
objectsStolen.add(items[curItemIndex]);
stealObjects(packCapacity, items, curItemIndex + 1, path, objectsStolen, curWeight + items[curItemIndex].weight, curValue + items[curItemIndex].value);
objectsStolen.removeLast();
}
path[curItemIndex] = 0;
stealObjects(packCapacity, items, curItemIndex + 1, path, objectsStolen, curWeight, curValue);
}
public static LinkedList<Item> solveKnapsackProblem(int packCapacity, Item[] items) {
LinkedList<Item> objectsStolen = new LinkedList<>();
int[] path = new int[items.length];
Arrays.sort(items, Comparator.comparingDouble(Item::getRatio).reversed());
stealObjects(packCapacity, items, 0, path, objectsStolen, 0, 0);
return bestSolution;
}
public static void main(String[] args) {
Item[] items = {
new Item("IPhone", 2000, 1),
new Item("吉他", 1500, 1),
new Item("笔记本电脑", 2000, 3),
new Item("音箱", 3000, 4)
};
LinkedList<Item> objectsStolen = solveKnapsackProblem(4, items);
int totalValue = 0;
System.out.println("偷了如下物品:");
for (Item item : objectsStolen) {
totalValue += item.value;
System.out.println(item.name);
}
System.out.println("总价值:" + totalValue);
}
}