zoukankan      html  css  js  c++  java
  • 贪心算法回顾

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

     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
    ____________________________特此,勉励____________________________
    本文作者cheng2839
    本文链接https://www.cnblogs.com/cheng2839
    关于博主:评论和私信会在第一时间回复。
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    大数板子
    数位dp
    BM算法
    牛客小白月赛7
    划分树
    可持久化线段树
    素数
    一些数学公式
    线性基
    ConcurrentHashMap 并发HashMap原理分析
  • 原文地址:https://www.cnblogs.com/cheng2839/p/12884271.html
Copyright © 2011-2022 走看看