0-1背包问题是组合优化问题的一种,它描述了在给定一组物品和一个固定容量的背包的情况下,如何选择物品放入背包,使得它们的总价值最大,同时保持总重量不超过背包的容量。与分数背包问题不同,0-1背包问题要求每个物品要么完全装入背包,要么不装入,不能部分装入。
贪心解法,会得到错误的结果,可以用动态规划解决,请看0-1背包-动态规划
public class KnapsackProblem {
/**
* 0-1 背包问题
* 1.n个物品都是固体,有重量和价值
* 2.现在你要取走不超过 10克 的物品
* 3.每次可以不拿或全拿,问最高价值是多少
* 编号 重量(g) 价值(元)
* 0 1 1_000_000 钻戒一枚
* 1 4 1600 黄金一块
* 2 8 2400 红宝石戒指一枚
* 3 5 30 白银一块
*/
static class Item {
int index;
int weight;
int value;
public Item(int index, int weight, int value) {
this.index = index;
this.weight = weight;
this.value = value;
}
public int unitValue() {
return value / weight;
}
@Override
public String toString() {
return "Item(" +
"index=" + index +
')';
}
}
static void select(Item[] items, int total) {
Arrays.sort(items, Comparator.comparingInt(Item::unitValue).reversed());
int max = 0; //最大价值
for (Item item : items) {
System.out.println(item);
if (total >= item.weight) {//可以拿完
total -= item.weight;
max += item.value;
}
}
System.out.println("最大价值是:"+max);
}
public static void main(String[] args) {
Item[] items = new Item[]{
new Item(0, 1, 1000000),
new Item(1, 4, 1600),
new Item(2, 8, 2400),
new Item(3, 5, 30),
};
select(items, 10);
}
}