Java 算法贪心算法

Posted binarylei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 算法贪心算法相关的知识,希望对你有一定的参考价值。

Java 算法(一)贪心算法

数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html)

一、贪心算法

什么是贪心算法?是指在对问题进行求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所得出的结果仅仅是某种意义上的局部最优解。 因此贪心算法不会对所有问题都能得到整体最优解,但对于很多问题能产生整体最优解或整体最优解的近似解。

贪心算法的构成部分:

  1. 候选对象集合 :候选添加进解的对象的结合·
  2. 解对象集合 :初始时为空,逐步从候选对象集合添加
  3. 解判定函数 :判定解是否己经完成(或候选对象集合是否还有可以添加的对象)
  4. 选择函数 :从候选对象集合中按照贪心策略选择可用对象添加到解对象集合中
  5. 目标函数 :记录解的值

二、0-1 背包问题

给定 n 种物品和一个背包。物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

经典的背包问题,这次选用贪心算法来解决,每次选择能装的物品中:

  1. 价值最大的
  2. 重量最小的
  3. 单位重量价值最大的
/**
 * 贪心算法:0-1 背包问题
 */
public class GreedyAlgorithm {

    // 候选对象
    private Bag[] candidates;
    // 背包的总承重
    private int maxWeight;

    // 解对象集合
    private Set<Bag> resultSet = new HashSet<>();
    // 解对象集合的值
    private int result;

    public GreedyAlgorithm(Bag[] candidates, int maxWeight) {
        this.candidates = candidates;
        this.maxWeight = maxWeight;
        // 对背包按单位重量价值从大到小排序
        Arrays.sort(candidates, Collections.reverseOrder());
    }

    public void select() {
        int remainingWeight = maxWeight;

        for (int i = 0; i < candidates.length; i++) {
            Bag candidate = candidates[i];
            // 判断当前物品是否可以放入背包中
            if (check(candidate, remainingWeight)) {
                result += candidate.value;
                resultSet.add(candidate);
                remainingWeight -= candidate.weight;
            } else {
                break;
            }
        }
    }

    // 判定解是否己经完成
    public boolean check(Bag candidate, int remainingWeight) {
        if (remainingWeight >= candidate.weight) {
            return true;
        }
        return false;
    }

    public Set<Bag> getResultSet() {
        return resultSet;
    }

    public int getResult() {
        return result;
    }

    public static class Bag implements Comparable<Bag> {
        // 物品重量
        private int weight;
        // 物品价值
        private int value;
        // 单位重量价值
        private int unitValue;

        public Bag(int weight, int value) {
            this.weight = weight;
            this.value = value;
            this.unitValue = (weight == 0) ? 0 : value / weight;
        }

        @Override
        public int compareTo(Bag bag) {
            int value = bag.unitValue;
            if (unitValue > value)
                return 1;
            if (unitValue < value)
                return -1;
            return 0;
        }
    }
}

每天用心记录一点点。内容也许不重要,但习惯很重要!

以上是关于Java 算法贪心算法的主要内容,如果未能解决你的问题,请参考以下文章

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 18 贪心算法

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 18 贪心算法

JAVA 基于贪心算法求解TSP问题

贪心算法----区间覆盖问题(POJ2376)

Day593&594.贪心算法 -数据结构和算法Java

跟耿老师学Java:贪心算法与老鼠走迷宫