背包问题是指有一个固定大小的背包,需要在一系列物品中选择一些放入背包中,以使得物品的总价值最大。每个物品有一个重量和一个价值,背包有一个最大容量,不能超过这个容量。
算法思路:
- 定义物品类Item,包含物品的重量和价值。
- 将物品按照单位价值(价值/重量)从高到低排序。
- 遍历排序后的物品列表,将单位价值高的物品先放入背包中,直到背包已满或物品全部放入为止。
- 如果背包未满,则将下一个单位价值次高的物品放入背包中。
代码实现及注释:
import java.util.Arrays;
import java.util.Comparator;
public class Knapsack {
// 物品类,包含物品的重量和价值
private static class Item {
int weight; // 物品重量
int value; // 物品价值
public Item(int weight, int value) {
this.weight = weight;
this.value = value;
}
}
public static void main(String[] args) {
// 背包容量
int capacity = 50;
// 物品列表,每个物品包含重量和价值
Item[] items = {
new Item(10, 60),
new Item(20, 100),
new Item(30, 120),
new Item(40, 140),
new Item(50, 160)
};
// 按照单位价值(价值/重量)从高到低排序
Arrays.sort(items, Comparator.comparingDouble((Item item) -> (double) item.value / item.weight).reversed());
// 背包内物品的总价值和总重量
int totalValue = 0;
int totalWeight = 0;
// 遍历物品列表,将单位价值高的物品先放入背包中
for (Item item : items) {
// 如果背包已满,退出循环
if (totalWeight == capacity) {
break;
}
// 如果当前物品的重量小于等于背包剩余容量,则将该物品放入背包中
if (item.weight <= capacity - totalWeight) {
totalValue += item.value;
totalWeight += item.weight;
}
// 否则,将当前物品的一部分放入背包中,使得背包满载
else {
totalValue += (int) ((double) (capacity - totalWeight) / item.weight * item.value);
totalWeight = capacity;
}
}
// 输出背包内物品的总价值和总重量
System.out.println("Total value: " + totalValue);
System.out.println("Total weight: " + totalWeight);
}