当前位置: 首页 > news >正文

贪心算法java

贪心算法简介

贪心算法是一种在每一步选择中都采取在当前状态下最优(局部最优)的选择,从而希望导致结果是全局最优的算法。贪心算法通常用于解决最优化问题,如最短路径、最小生成树、任务调度等。

贪心算法的基本步骤

  1. 问题分析:明确问题的目标,确定是否可以通过贪心策略解决。
  2. 选择贪心策略:设计一个局部最优的选择标准。
  3. 证明贪心选择性质:确保局部最优选择能导致全局最优解。
  4. 实现算法:根据贪心策略编写代码。

贪心算法的Java实现示例

示例1:找零问题

给定不同面额的硬币和一个总金额,计算最少需要多少枚硬币来凑成总金额。

import java.util.Arrays;public class CoinChange {public static int minCoins(int[] coins, int amount) {Arrays.sort(coins); // 排序以便从大到小使用int count = 0;for (int i = coins.length - 1; i >= 0; i--) {while (amount >= coins[i]) {amount -= coins[i];count++;}}return amount == 0 ? count : -1; // 如果无法凑整返回-1}public static void main(String[] args) {int[] coins = {1, 5, 10, 25};int amount = 63;System.out.println("最少硬币数: " + minCoins(coins, amount));}
}

示例2:活动选择问题

给定一组活动,每个活动有开始时间和结束时间,选择尽可能多的互不冲突的活动。

import java.util.ArrayList;
import java.util.Comparator;public class ActivitySelection {static class Activity {int start, end;Activity(int start, int end) {this.start = start;this.end = end;}}public static ArrayList<Activity> selectActivities(Activity[] activities) {ArrayList<Activity> result = new ArrayList<>();// 按结束时间排序Arrays.sort(activities, Comparator.comparingInt(a -> a.end));result.add(activities[0]);int lastEnd = activities[0].end;for (int i = 1; i < activities.length; i++) {if (activities[i].start >= lastEnd) {result.add(activities[i]);lastEnd = activities[i].end;}}return result;}public static void main(String[] args) {Activity[] activities = {new Activity(1, 4),new Activity(3, 5),new Activity(0, 6),new Activity(5, 7),new Activity(8, 9)};ArrayList<Activity> selected = selectActivities(activities);System.out.println("选择的活动数量: " + selected.size());}
}

贪心算法的适用条件

  1. 贪心选择性质:每一步的局部最优选择能导致全局最优解。
  2. 最优子结构:问题的最优解包含子问题的最优解。

贪心算法的局限性

贪心算法并不总是能得到最优解,例如在部分背包问题中,贪心策略可能无法得到全局最优解。因此,在使用贪心算法前,需要验证其正确性。

总结

贪心算法通过局部最优选择逐步构建全局最优解,适用于某些特定类型的问题。Java实现时,通常需要排序或优先队列来辅助选择。理解贪心算法的适用条件和局限性是正确使用它的关键。


文章转载自:

http://rxrGqcLL.qkdcb.cn
http://WOOD6N9V.qkdcb.cn
http://2r2UTnc5.qkdcb.cn
http://IlDpwWYd.qkdcb.cn
http://2GsZQVTt.qkdcb.cn
http://iL2Q8bfg.qkdcb.cn
http://eMBoQ2Tx.qkdcb.cn
http://veQeSD6b.qkdcb.cn
http://C8m3E6Dp.qkdcb.cn
http://CxLVXvob.qkdcb.cn
http://avbcodoz.qkdcb.cn
http://HDzBKiuQ.qkdcb.cn
http://HCOxkmYi.qkdcb.cn
http://qe6sm7w1.qkdcb.cn
http://rMGCDF7f.qkdcb.cn
http://znxXDKwJ.qkdcb.cn
http://ZdF7VT5k.qkdcb.cn
http://DRnMXiYg.qkdcb.cn
http://i3ZL3Jgf.qkdcb.cn
http://KvWLRfl0.qkdcb.cn
http://ZSxLjBI4.qkdcb.cn
http://1dghL0dC.qkdcb.cn
http://42Myn2tI.qkdcb.cn
http://JihDtuxi.qkdcb.cn
http://JBQzkkV9.qkdcb.cn
http://axLEj4tJ.qkdcb.cn
http://Kv99JSsj.qkdcb.cn
http://uCjIlNEP.qkdcb.cn
http://KDjpUBsH.qkdcb.cn
http://gdI6JEO6.qkdcb.cn
http://www.dtcms.com/a/382780.html

相关文章:

  • AI问答-Nuxt4:什么时候发布的,有哪些特性,和Nuxt3相比 有哪些优势 / Nuxt4 / Nuxt-v4
  • MyBatis 从入门到精通(第三篇)—— 动态 SQL、关联查询与查询缓存
  • 10 C++map/set的底层数据结构红黑树它来了,红黑树入门全解。
  • 【iOS】ViewController的生命周期
  • 数据库基础-01
  • 免费无版权!PPT图标素材的6个优质获取渠道
  • 【STL库】map/set 的封装原理
  • 市面上各类USB无线抓包网卡测试与收录(握手包抓包/无线监听)
  • 基于bang-bang起停式算法的交流电机FOC控制系统simulink建模与模拟仿真
  • 使用HTTPS 服务在浏览器端使用摄像头的方式解析
  • AI 机器视觉检测方案:破解食物包装四大质检难题,筑牢食品安全防线
  • Science Advances--3D打印生物启发扭曲双曲超材料,用于无人机冲击缓冲和自供电实时传感
  • HarmonyOS生态开发核心工具技术介绍及关于CSDN增加ArkTS等标签建议
  • 【算法笔记】堆和堆排序
  • 电商导购系统的微服务监控体系:基于Prometheus与Grafana的可视化方案
  • fMoE论文阅读笔记
  • 721SJBH笔记本电脑销售网站
  • k3s集群部署(使用外部etcd集群)
  • 京东返利app的分布式ID生成策略:雪花算法在订单系统中的实践
  • 大数据分析岗位发展前景与行业需求分析
  • 【Linux手册】共享内存:零拷贝实现共享的优势与实操指南
  • ARM的TrustZone
  • 返利app排行榜的缓存更新策略:基于过期时间与主动更新的混合方案
  • springboot+zookeeper+(2025最新)Dubbo-admin实现分布式
  • 缓存与数据库一致性实战手册:从故障修复到架构演进
  • 基于 Linux 内核模块的字符设备 FIFO 驱动设计与实现解析(C/C++代码实现)
  • 【C++】类和对象(下):初始化列表、类型转换、Static、友元、内部类、匿名对象/有名对象、优化
  • JSON、Ajax
  • 第2课:Agent系统架构与设计模式
  • Python上下文管理器进阶指南:不仅仅是with语句