import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
public class BranchAndBoundKnapsack {
static class Item {
int weight;
int value;
double valuePerWeight;
public Item(int weight, int value) {
this.weight = weight;
this.value = value;
this.valuePerWeight = (double) value / weight;
}
}
static class Node {
int level;
int weight;
int value;
List<Item> selectedItems;
public Node(int level, int weight, int value, List<Item> selectedItems) {
this.level = level;
this.weight = weight;
this.value = value;
this.selectedItems = selectedItems;
}
}
public static int knapsack(Item[] items, int capacity) {
Arrays.sort(items, Comparator.comparingDouble(item -> -item.valuePerWeight));
Node root = new Node(0, 0, 0, new ArrayList<>());
int bestValue = 0;
PriorityQueue<Node> queue = new PriorityQueue<>(Comparator.comparingInt(node -> -node.value));
queue.offer(root);
while (!queue.isEmpty()) {
Node node = queue.poll();
if (node.weight > capacity) {
continue;
}
bestValue = Math.max(bestValue, node.value);
if (node.level == items.length) {
continue;
}
Item item = items[node.level];
List<Item> selectedItems = new ArrayList<>(node.selectedItems);
selectedItems.add(item);
Node leftChild = new Node(
node.level + 1,
node.weight + item.weight,
node.value + item.value,
selectedItems
);
queue.offer(leftChild);
Node rightChild = new Node(node.level + 1, node.weight, node.value, node.selectedItems);
queue.offer(rightChild);
}
return bestValue;
}
public static void main(String[] args) {
Item[] items = {
new Item(10, 60),
new Item(20, 100),
new Item(30, 120)
};
int capacity = 50;
int maxValue = knapsack(items, capacity);
System.out.println("最大价值为:" + maxValue);
}
}