贪心算法回顾

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

 

 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.Set;
 7 import java.util.TreeMap;
 8 
 9 /**
10  * 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。
11  * 也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
12  *
13  * 例题如下:
14  * 有一个背包,背包容量是M=150kg。有7个物品,物品不可以分割成任意大小。
15  * 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
16  * 物品 A B C D E F G
17  * 重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg
18  * 价值 10$ 40$ 30$ 50$ 35$ 40$ 30$
19  */
20 public class GreedyAlgo {
21 
22     private static final int M = 150;
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     private static Map<Good, Character> map = new TreeMap<>((o1,o2)->o1.price==o2.price?0:(o1.price<o2.price?1:-1));
28 
29     public GreedyAlgo() {
30         for (int i=0; i<GOODS.length; i++) {
31             map.put(new Good(GOODS[i], WEIGHTS[i], COSTS[i]), GOODS[i]);
32         }
33     }
34 
35     public List<Good> run() {
36         List<Good> resultList = new ArrayList<>();
37         int weight = 0;
38         for (Good g : map.keySet()) {
39             if (weight+g.weight<=M) {
40                 resultList.add(g);
41                 weight += g.weight;
42             }
43         }
44         return resultList;
45     }
46 
47     public static void main(String[] args) {
48        List<Good> result = new GreedyAlgo().run();
49        System.out.println("可供选择的物品如下:");
50         for (Good key : map.keySet()) {
51             System.out.println(key);
52         }
53         System.out.println("通过贪心算法选取,得到的物品为:"+totalName(result));
54     }
55 
56     private static List<Character> totalName(List<Good> result) {
57         List<Character> characterList = new ArrayList<>();
58         result.forEach(key -> characterList.add(key.name));
59         return characterList;
60     }class Good {
61         char name;
62         int weight;
63         float cost;
64         float price;
65         public Good(char name, int weight, float cost) {
66             this.name = name;
67             this.weight = weight;
68             this.cost = cost;
69             this.price = cost/weight;
70         }
71     }
72 }

 

打印结果如下:

 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

 

posted @ 2020-05-13 18:58  温柔的星空,让你感动  阅读(142)  评论(0编辑  收藏  举报