贪心算法回顾

Posted cheng2839

tags:

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

各位好,贪心算法可以说是处处学到,被面试频频问道,接下来回顾以下,并上代码:

 

  1 package com.clb.ai.algorithm;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import java.util.Map;
  6 import java.util.TreeMap;
  7 
  8 /**
  9  * 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。
 10  * 也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
 11  *
 12  * 例题如下:
 13  * 有一个背包,背包容量是M=150kg。有7个物品,物品不可以分割成任意大小。
 14  * 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
 15  * 物品 A B C D E F G
 16  * 重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg
 17  * 价值 10$ 40$ 30$ 50$ 35$ 40$ 30$
 18  */
 19 public class GreedyAlgo {
 20 
 21     private static final int M = 150;
 22 
 23     private static final char[] GOODS = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘};
 24     private static final int[] WEIGHTS = {35, 30, 6, 80, 40, 10, 25};
 25     private static final float[] COSTS = {10, 40, 30, 80, 35, 40, 30};
 26 
 27     //按照价值大小进行排序
 28     private static Map<Good, Character> map = new TreeMap<>((o1,o2)->o1.price==o2.price?0:(o1.price<o2.price?1:-1));
 29 
 30     public GreedyAlgo() {
 31         for (int i=0; i<GOODS.length; i++) {
 32             map.put(new Good(GOODS[i], WEIGHTS[i], COSTS[i]), GOODS[i]);
 33         }
 34     }
 35 
 36     public List<Good> run(){
 37         List<Good> resultList = new ArrayList<>();
 38 
 39         int weight = 0;
 40         while (weight<M) {
 41             boolean found = false;
 42             for (Good v : map.keySet()) {
 43                 if (!resultList.contains(v) && v.weight <= M-weight) {
 44                     resultList.add(v);
 45                     weight += v.weight;
 46                     found = true;
 47                 }
 48             }
 49             if (!found) break;
 50         }
 51 
 52         return resultList;
 53     }
 54 
 55     public static void main(String[] args) {
 56        List<Good> result = new GreedyAlgo().run();
 57 
 58        System.out.println("可供选择的物品如下:");
 59         for (Good key : map.keySet()) {
 60             System.out.println(key);
 61         }
 62 
 63         System.out.println("通过贪心算法选取,得到的物品为:"+totalName(result));
 64         float totalCost, totalWeight;
 65         System.out.println("总重量:"+(totalWeight=totalWeight(result))+"	总价值:"+(totalCost=totalCost(result))+"	单位价值:"+(totalCost/totalWeight));
 66     }
 67 
 68     private static List<Character> totalName(List<Good> result) {
 69         List<Character> characterList = new ArrayList<>();
 70         result.forEach(key -> characterList.add(key.name));
 71         return characterList;
 72     }
 73 
 74     private static float totalCost(List<Good> result) {
 75         float sum = 0;
 76         for (Good c : result) {
 77             sum += c.cost;
 78         }
 79         return sum;
 80     }
 81     private static int totalWeight(List<Good> result) {
 82         int sum = 0;
 83         for (Good c : result) {
 84             sum += c.weight;
 85         }
 86         return sum;
 87     }
 88 
 89     class Good {
 90         char name;
 91         int weight;
 92         float cost;
 93         float price;
 94         public Good(char name, int weight, float cost) {
 95             this.name = name;
 96             this.weight = weight;
 97             this.cost = cost;
 98             this.price = cost/weight;
 99         }
100 
101         @Override
102         public String toString() {
103             final StringBuffer sb = new StringBuffer();
104             sb.append("名称:").append(name);
105             sb.append("	重量:").append(weight);
106             sb.append("	总价值:").append(cost);
107             sb.append("	单位价值:").append(price);
108             return sb.toString();
109         }
110     }
111 
112 }

 

打印结果如下:

 1 可供选择的物品如下:
 2 名称:C    重量:6    总价值:30.0    单位价值:5.0
 3 名称:F    重量:10    总价值:40.0    单位价值:4.0
 4 名称:B    重量:30    总价值:40.0    单位价值:1.3333334
 5 名称:G    重量:25    总价值:30.0    单位价值:1.2
 6 名称:D    重量:80    总价值:80.0    单位价值:1.0
 7 名称:E    重量:40    总价值:35.0    单位价值:0.875
 8 名称:A    重量:35    总价值:10.0    单位价值:0.2857143
 9 通过贪心算法选取,得到的物品为:[C, F, B, G, E, A]
10 总重量:146.0    总价值:185.0    单位价值:1.2671233

 

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

「经典题目回顾」贪心算法:买卖股票的最佳时机II

贪心算法:划分字母区间

763. 划分字母区间-贪心算法

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

Contig|scaffold|N50|L50|NG50|贪心算法|de bruiji graph|

信息学集训 | 14 贪心算法理论与实战