1. 程式人生 > >Java 算法(一)貪心算法

Java 算法(一)貪心算法

ash 選擇 ray 數據結構 unit clas 重要 最好 seo

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 算法(一)貪心算法