Java 算法(一)貪心算法
阿新 • • 發佈:2018-12-15
ash 選擇 ray 數據結構 unit clas 重要 最好 seo
Java 算法(一)貪心算法
數據結構與算法目錄(https://www.cnblogs.com/binarylei/p/10115867.html)
一、貪心算法
什麽是貪心算法?是指在對問題進行求解時,總是做出當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,所得出的結果僅僅是某種意義上的局部最優解。 因此貪心算法不會對所有問題都能得到整體最優解,但對於很多問題能產生整體最優解或整體最優解的近似解。
貪心算法的構成部分:
- 候選對象集合 :候選添加進解的對象的結合·
- 解對象集合 :初始時為空,逐步從候選對象集合添加
- 解判定函數 :判定解是否己經完成(或候選對象集合是否還有可以添加的對象)
- 選擇函數
- 目標函數 :記錄解的值
二、0-1 背包問題
給定 n 種物品和一個背包。物品 i 的重量是 Wi,其價值為 Vi,背包的容量為 C。應如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大?
經典的背包問題,這次選用貪心算法來解決,每次選擇能裝的物品中:
- 價值最大的
- 重量最小的
- 單位重量價值最大的
/** * 貪心算法: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 算法(一)貪心算法