0-1背包-贪心

117 阅读1分钟

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);

    }

}