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

贪心算法-以高校教材管理系统为例

1.贪心算法介绍 

1.算法思路

贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一 步都要确保能获得局部最优解。每一步只考虑一 个数据,其选取应该满足局部优化的条件。若下 一个数据和部分最优解连在一起不再是可行解时, 就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。 

贪心算法一般按如下步骤进行: 

①建立数学模型来描述问题 。

②把求解的问题分成若干个子问题 。

③对每个子问题求解,得到子问题的局部最优解 。

④把子问题的解局部最优解合成原来解问题的一个解 。

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯 。

2.代码介绍

// 定义一个方法来计算最优的教材分配方案private static void calculateOptimalTextbookAllocation(Scanner scanner, SchoolService schoolService, TextbookService textbookService) {// 获取所有学校的列表和所有教材的列表List<School> schools = schoolService.listAllSchools();List<Textbook> textbooks = textbookService.listAllTextbooks();// 创建一个映射,存储每个学校的需求Map<Integer, Integer> schoolDemand = new HashMap<>();for (School school : schools) {System.out.print("请输入学校ID " + school.getSchoolId() + " 的需求:");int demand = scanner.nextInt(); // 从用户那里获取需求schoolDemand.put(school.getSchoolId(), demand); // 存储需求到映射}// 创建一个映射,存储每种教材的数量Map<Integer, Integer> textbookQuantity = new HashMap<>();for (Textbook textbook : textbooks) {System.out.print("请输入教材ID " + textbook.getTextbookId() + " 的数量:");int quantity = scanner.nextInt(); // 从用户那里获取教材数量textbookQuantity.put(textbook.getTextbookId(), quantity); // 存储教材数量到映射}// 使用Java 8的Streams API对学校列表按照需求进行降序排序// 这里使用了方法引用School::getSchoolId代替lambda表达式schools.sort(Comparator.comparingInt(School::getSchoolId).reversed());// 创建一个映射,存储最终的教材分配结果Map<Integer, Integer> allocation = new HashMap<>();for (School school : schools) {int demand = schoolDemand.get(school.getSchoolId()); // 获取当前学校的需求for (Textbook textbook : textbooks) {int quantity = textbookQuantity.get(textbook.getTextbookId()); // 获取当前教材的数量// 如果教材数量和需求都大于0,则进行分配if (quantity > 0 && demand > 0) {int allocated = Math.min(demand, quantity); // 计算可以分配的数量// 更新分配结果映射,增加分配数量allocation.put(school.getSchoolId(), allocation.getOrDefault(school.getSchoolId(), 0) + allocated);// 从教材数量中减去已分配的数量textbookQuantity.put(textbook.getTextbookId(), quantity - allocated);// 减少学校的需求demand -= allocated;}}}// 打印最优教材分配方案System.out.println("最优教材分配方案:");for (School school : schools) {int allocated = allocation.getOrDefault(school.getSchoolId(), 0); // 获取学校分配到的教材数量System.out.println("学校ID:" + school.getSchoolId() + ",分配数量:" + allocated);}}

3.应用概括

使用的算法是一个简单的贪心算法,尝试为每个学校分配尽可能多的教材,直到满足学校的需求或教材用尽。学校根据需求从大到小排序,以确保需求量大的学校能够优先获得教材分配。教材分配过程是一个迭代过程,每次迭代中都会尝试为当前学校分配尽可能多的教材,直到需求被满足或教材用尽。这个过程一直持续,直到所有学校都得到了尽可能多的教材分配。 

算法流程:

1. 初始化阶段:通过服务接口获取所有学校和教材的列表,初始化存储学校需求和教材数量的数据结构。

2. 数据收集:通过控制台输入,收集每个学校的需求和每种教材的可用数量。

3. 排序操作:将学校列表按照需求从大到小排序,以便优先满足需求量较大的学校。

4. 分配过程:遍历排序后学校的列表,对每所学校尝试分配教材,直到学校需求得到满足或教材用尽。

5. 更新状态:在分配过程中,更新已分配教材的数量和学校剩余需求。

6. 输出结果:打印最终的教材分配方案。

 代码实现:

 使用 `Scanner` 从控制台读取用户输入,获取学校的需求和教材的数量。

 使用 `HashMap` 存储学校需求和教材数量,便于快速访问和更新。

 使用 `List` 存储学校对象,并利用 `Collections.sort()` 方法进行排序。

 通过两层嵌套循环实现分配逻辑:外层循环遍历学校,内层循环遍历教材。

 数据结构:

 `List<School>` 和 `List<Textbook>`:存储学校和教材对象的列表,便于进行排序和遍历。

 `Map<Integer, Integer>`:存储学校需求和教材数量,键为学校ID或教材ID,值为需求或数量。这种映射提供了快速查找和更新的能力。

 `Comparator.comparingInt`:用于自定义排序逻辑,这里用于根据学校的需求进行排序

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Pandas中使用函数作为map函数的参数时为什么不用传入函数的参数的问题解答
  • 【R语言+Gephi】利用R语言和Gephi实现共发生网络的可视化
  • Web3时代的数字身份认证:安全性与隐私保护探讨
  • Python面试题:如何在 Python 中发送 HTTP 请求?
  • 复合机器人:手脚眼脑的完美结合
  • 一文了解java中Optional
  • Quartz 核心
  • 在误装Windows server2019 后如何利用Windows.old恢复?
  • Python面试题:如何在 Python 中进行正则表达式操作?
  • C++笔试真题
  • FFmpeg 初级操作—打印日志,文件目录操作
  • 数学基础 -- 函数的连续性
  • 帕金森患者营养小贴士
  • 昇思25天学习打卡营第17天|SSD目标检测
  • Apache AGE 安装部署
  • [译]前端离线指南(上)
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android交互
  • Java知识点总结(JavaIO-打印流)
  • LeetCode算法系列_0891_子序列宽度之和
  • Mocha测试初探
  • NSTimer学习笔记
  • Redis 中的布隆过滤器
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Vultr 教程目录
  • zookeeper系列(七)实战分布式命名服务
  • 如何设计一个比特币钱包服务
  • 提醒我喝水chrome插件开发指南
  • 小程序开发中的那些坑
  • 携程小程序初体验
  • Java性能优化之JVM GC(垃圾回收机制)
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #Java第九次作业--输入输出流和文件操作
  • (C++17) std算法之执行策略 execution
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (层次遍历)104. 二叉树的最大深度
  • (分类)KNN算法- 参数调优
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)Google的Objective-C编码规范
  • (转)linux下的时间函数使用
  • **PHP二维数组遍历时同时赋值
  • .axf 转化 .bin文件 的方法
  • .gitignore文件使用
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 8.0 中有哪些新的变化?
  • .Net Redis的秒杀Dome和异步执行
  • .Net Winform开发笔记(一)
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net反混淆脱壳工具de4dot的使用
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET性能优化(文摘)
  • .net中的Queue和Stack
  • .pyc文件是什么?
  • /etc/sudoer文件配置简析
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400