import java.util.LinkedList;
public class Backpack {
public static class Item {
public String name;
public int value;
public int weight;
public Item(String n, int v, int w) {
this.name = n;
this.value = v;
this.weight = w;
}
}
public static LinkedList<Item> stealObject(int packCapacity, Item[] items) {
int numItems = items.length;
int[][] dp = new int[numItems + 1][packCapacity + 1];
for (int i = 1; i <= numItems; i++) {
for (int j = 1; j <= packCapacity; j++) {
if (items[i - 1].weight <= j) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - items[i - 1].weight] + items[i - 1].value);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
LinkedList<Item> objectInPack = new LinkedList<>();
int i = numItems;
int j = packCapacity;
while (i > 0 && j > 0) {
if (dp[i][j] != dp[i - 1][j]) {
objectInPack.addFirst(items[i - 1]);
j -= items[i - 1].weight;
}
i--;
}
return objectInPack;
}
public static void test() {
Item[] items = {
new Item("吉他", 1500, 1),
new Item("笔记本电脑", 2000, 3),
new Item("音箱", 3000, 4),
new Item("iPhone", 2000, 1)
};
LinkedList<Item> objectInPack = stealObject(4, items);
int maxValue = 0;
System.out.println("偷了如下物品:");
for (int i = 0; i < objectInPack.size(); ++i) {
maxValue += objectInPack.get(i).value;
System.out.println(objectInPack.get(i).name);
}
System.out.println("总价值:" + maxValue);
}
public static void main(String[] args) {
test();
}
}