java贪心算法

迷南。 2021-06-10 20:38 594阅读 0赞

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。百度百科介绍传送门

举一个简单的例子
有一个背包,最多能承载150斤的重量,现在有7个物品,重量分别为[35, 30, 60, 50, 40, 10, 25],它们的价值分别为[10, 40, 30, 50, 35, 40, 30],如果是你的话,应该如何选择才能使得我们的背包背走最多价值的物品?

个人思路分析,也就是贪心算法的思路,通过求性价比,然后排序性价比,最后从性价比最大的开始选择,直到装满为止,这就是贪心算法的思路。下面上代码

  1. /**
  2. * 贪心算法,我们可以通过求出性价比,然后排序性价比,然后从性价比最大的开始选择,直到装满为止。这就是贪心算法的思路。
  3. */
  4. public class BeiBao {
  5. //定义最大负重,weight数组保存重量,values数组保存价值
  6. public int max_weight = 150;
  7. public static int[] weight = new int[] {35,30,60,50,40,10,25};
  8. public static int[] value = new int[] {10,40,30,50,35,40,30};
  9. //
  10. public void greedyPackage(int capacity, int[] weight , int[] value) {
  11. //性价比数组创建并排序
  12. int n = weight.length;//总个数
  13. double[] price = new double[n];//性价比数组
  14. int count[] = new int[n];//序号数组
  15. //求性价比
  16. for (int i = 0; i < n; i++) {
  17. price[i] = (double)value[i] / weight[i];
  18. System.out.println(price[i]);
  19. count[i] = i;
  20. }
  21. //性价比排序
  22. for (int i = 0; i < n - 1; i++) {
  23. for (int j = i; j < n - 1; j++) {
  24. if (price[j] < price[j + 1]) {
  25. double tmp = price[j];
  26. price[j] = price[j + 1];
  27. price[j + 1] = tmp;
  28. //交换性价比排序后,再吧序号交换,方便之后取数
  29. int a = count[j];
  30. count[j] = count[j + 1];
  31. count[j + 1] = a;
  32. }
  33. }
  34. }
  35. //把质量和价值也按照性价比的排序顺序对应好,存到新数组里
  36. int newWeight[] = new int[n];
  37. int newValue[] = new int[n];
  38. for (int i = 0; i < n; i++) {
  39. newValue[i] = value[count[i]];
  40. newWeight[i] = weight[count[i]];
  41. }
  42. double maxValue = 0;
  43. //装东西,优先拿性价比高的
  44. for (int i = 0; i < n; i++) {
  45. if (capacity > newWeight[i]) {
  46. capacity -= newWeight[i];
  47. maxValue += newValue[i];
  48. }
  49. }
  50. System.out.print("共放下了" + (max_weight - capacity) +"kg重的东西\n");
  51. System.out.print("总价值" + maxValue);
  52. }
  53. public static void main(String[] args) {
  54. BeiBao greedyPackage = new BeiBao();
  55. greedyPackage.greedyPackage(greedyPackage.max_weight, weight, value);
  56. }
  57. }

感谢大佬的高性能版

  1. private void greedyPackageV2(Integer capacity, Integer[] weight , Integer[] value) {
  2. List<Integer> weightList = Arrays.asList(weight);
  3. List<Integer> valueList = Arrays.asList(value);
  4. Map<Integer,Double> price = new HashMap<>();//性价比数组
  5. List<Integer> count = new ArrayList<>();
  6. for (int i = 0; i < weightList.size(); i++) {
  7. price.put(i, valueList.get(i) / weightList.get(i).doubleValue());
  8. }
  9. List<Map.Entry<Integer,Double>> list = new ArrayList<>(price.entrySet()); //将map的entryset放入list集合
  10. //根据性价比排序并取出倒序序后下标
  11. list.sort(Comparator.comparing(Map.Entry<Integer,Double>::getValue).reversed());//根据性价比倒序
  12. list.forEach(entry -> count.add(entry.getKey()));
  13. double maxValue = 0;
  14. //装东西,优先拿性价比高的
  15. for (int i = 0; i < count.size(); i++) {
  16. if (capacity > weight[count.get(i)]) {
  17. capacity -= weight[count.get(i)];
  18. maxValue += value[count.get(i)];
  19. }
  20. }
  21. System.out.println("总共放下了" + (max_weight - capacity) + "kg重的东西");
  22. System.out.print("总价值" + maxValue+"\n");
  23. }

运行结果为
在这里插入图片描述
如果各位老鸟发现博文有问题,请评论指点谢谢
大家一起学的可以加一个QQ群774032881

发表评论

表情:
评论列表 (有 0 条评论,594人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java贪心算法

    1 应用场景-集合覆盖问题 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区 都可以接收到信号 ![在这里插入图片描述

    相关 Java贪心算法示例

    [点击进入尚硅谷数据结构和算法Java代码导航][Java] 问题描述:见最少的基站覆盖所有城市,解不一定是最优,但较优。 参考视频:https://www.bilibi

    相关 java实现贪心算法

    一、应用场景-集合覆盖问题 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区 都可以接收到信号 ![在这里插入图片描述

    相关 贪心算法

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。举一个简单的贪心法例子,平时

    相关 贪心算法

    1.钞票支付问题,1元,2元,5元,10元,20元,50元,100元钞票无穷张,使用这些钞票怎么支付,最少需要多少张。 思路:尽可能使用面额较大的金额数目。反证法:若不成立,

    相关 java贪心算法

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。 贪心算法不是对所有问