贪心算法-以学籍管理系统为例

1.贪心算法介绍 

1.算法思路

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

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

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

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

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

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

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

2.代码介绍

/*** 为指定学生推荐最合适的课程。* @param scanner 用于接收用户输入的Scanner对象。* @param studentService 用于获取学生信息的服务。* @param courseService 用于获取课程列表的服务。*/public static void recommendBestCourse(Scanner scanner, StudentService studentService, CourseService courseService) {// 提示用户输入学生ID并接收输入System.out.print("输入学生ID:");int studentID = scanner.nextInt();scanner.nextLine(); // 消耗换行符// 根据学生ID获取学生信息,如果学生不存在则返回Student student = studentService.getStudentById(studentID);if (student == null) {System.out.println("未找到该学生。");return;}// 获取所有课程的列表,如果没有课程信息则返回List<Course> courses = courseService.listAllCourses();if (courses.isEmpty()) {System.out.println("当前没有课程信息。");return;}// 使用贪心算法推荐最合适的课程Course bestCourse = findBestCourse(student, courses);if (bestCourse != null) {// 如果找到最佳课程,打印课程信息System.out.println("推荐的最合适课程是:" + bestCourse.getCourseName());System.out.println("课程ID: " + bestCourse.getCourseID());System.out.println("学分: " + bestCourse.getCreditHours());} else {System.out.println("没有找到合适的课程。");}}/*** 使用贪心算法找到最合适的课程。* @param student 需要推荐课程的学生。* @param courses 可供选择的所有课程列表。* @return 最佳课程对象。*/private static Course findBestCourse(Student student, List<Course> courses) {Course bestCourse = null; // 用于存储当前找到的最佳课程int maxScore = Integer.MIN_VALUE; // 用于存储当前最高分数// 遍历所有课程for (Course course : courses) {// 计算每个课程的得分int score = calculateCourseScore(student, course);// 如果当前课程的得分高于已知最高分数,则更新最佳课程和最高分数if (score > maxScore) {maxScore = score;bestCourse = course;}}// 返回得分最高的课程作为最佳课程推荐return bestCourse;}/*** 计算单个课程的得分,用于评估课程的适宜性。* @param student 学生对象。* @param course 课程对象。* @return 计算得到的课程得分。*/private static int calculateCourseScore(Student student, Course course) {int score = 0; // 初始化得分// 学分越高,得分越高,这里假设每1学分得10分score += course.getCreditHours() * 10;// 如果学生未修过该课程,额外加分,这里假设额外加50分List<Grade> grades = student.getGrades(new GradeService()); // 获取学生已修课程的列表boolean isTaken = grades.stream().anyMatch(grade -> grade.getCourseID() == course.getCourseID());if (!isTaken) {score += 50;}// 返回计算得到的得分return score;}

3.使用贪心算法为一个特定的学生推荐最合适的课程

1. 方法定义:
   - `recommendBestCourse` 是一个静态方法,它接收一个 `Scanner` 对象用于用户输入,以及 `StudentService` 和 `CourseService` 服务层对象,用于获取学生和课程信息。

2. 用户输入处理:
   - 程序首先提示用户输入一个学生ID,然后使用 `Scanner` 对象读取这个输入值。

3. 学生信息获取:
   - 使用 `studentService.getStudentById(studentID)` 方法根据学生ID获取学生信息。如果学生不存在,打印提示信息并结束方法执行。

4. 课程列表获取:
   - 调用 `courseService.listAllCourses()` 获取所有可用的课程列表。如果没有课程信息,同样打印提示信息并结束方法执行。

5. 推荐逻辑:
   - 通过调用 `findBestCourse` 方法使用贪心算法为学生推荐最合适的课程。

6. 贪心算法实现:
   - `findBestCourse` 方法遍历所有课程,并通过 `calculateCourseScore` 方法为每个课程计算一个得分。选择得分最高的课程作为最佳推荐。

7. 得分计算:
   - `calculateCourseScore` 方法定义了课程得分的计算逻辑。在这个例子中,得分基于两个因素:课程的学分和学生是否已修过该课程。学分越高得分越高,如果学生未修过该课程则额外加分。

8. 推荐结果输出:
   - 如果找到最佳课程,打印出课程名称、课程ID和学分信息。如果没有合适的课程,打印相应的提示信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单选多选提交问卷,代码示例

&#xff45;&#xff4c;&#xff45;&#xff4d;&#xff45;&#xff4e;&#xff54;中 需要对接口返回的数据进行分析。多选问题使用checkbox&#xff0c;单选题使用radio。 多选时可以绑定&#xff4d;&#xff49;&#xff4e;&#xff0f;&#xff4d;&#xff41;&am…

CS61B Data Structure-Jonathan Lecture2 using objects - OBJECTS METHODS

Recall String s1; // Step 1: declare a String variable s1 new String(); // Step 2: assign it a value, a new empty string objectString s2 new String(); // 1&2 combined今日知识点 situation: pointing to the same object s1 "Yow!";s2 s1; //…

onclick和@click有什么区别,究竟哪个更好使?

哈喽小伙伴们大家好,我是爱学英语的程序员,今天来给大家分享一些关于vue中事件绑定相关的内容,希望对大家有所帮助. 场景是这样的:我要实现一个切换栏,默认激活的是第一个标签,当鼠标移动到第二个标签是,对应的内容让激活.起初,我第一时间想到的是用element plus的组件来实现这…

[leetcode hot 150]第一百一十七题,填充每个节点的下一个右侧节点

题目&#xff1a; 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#x…

NVIDIA的vGPU技术或AMD的MxGPU技术

目录 将物理GPU资源切分为多个虚拟GPU(vGPU) 实现步骤 技术示例 优点与挑战 结论 NVIDIA的vGPU技术或AMD的MxGPU技术 NVIDIA的vGPU技术 AMD的MxGPU技术 将物理GPU资源切分为多个虚拟GPU(vGPU) 将物理GPU资源切分为多个虚拟GPU(vGPU)主要依赖于GPU虚拟化技术。这种…

pytorch LLM训练过程中的精度调试实践

pytorch LLM训练过程中的精度调试实践 1.查看权值的最大,最小值2.检测训练过程中的异常值A.通过hook module,检测异常值B.拦截算子,检测异常值,打印调用栈,保存输入参数,方便复现C.拦截算子,同时执行cpu计算,对比误差,找到第一个精度异常的算子D.以上的代码 3.根据上面dump的数…

dreamerV3 控制人形机器人行走举例

DreamerV3模型 DreamerV3 是一种先进的强化学习算法,它结合了模型预测控制(MPC)和深度学习,能够在复杂环境中实现高效的学习和控制。DreamerV3 通过构建环境的动态模型并使用该模型进行多步预测和优化,来学习复杂任务如人形机器人行走。 DreamerV3 原理简介 DreamerV3 …

flutter背景贴图的困难总结

需求&#xff1a;一张前景图&#xff0c;一张背景图。背景图可以放大缩小&#xff0c;可以平移。 复盘一下整个烦闷之旅。 困难一&#xff0c;保存成文件。 遇到了几个十分难受的问题。 现在回看是很简单&#xff0c;代码也没几行&#xff0c;可中间的思考过程是十分痛苦的&a…

FPGA_HDLBits:2.2Vectors2.3ModulesHierarchy

FPGA_HDLBits:2.2Vectors&2.3ModulesHierarchy 说明:仅对自己做的HDL Bits中的2.2-2.3章节题目的错误部分做的记录&#xff0c;正确的也就没有记录&#xff0c;可以理解为个人的错题本 对于reg [15:0]input input[0:7]是调用低位而不是取最高位&#xff0c;而且调的是最低…

SpringSecurity6.x使用教程

SpringSecurity6.x使用 SpringSecurity版本 SpringSecurity目前支持的版本如下图所示&#xff0c;可以看到5.x的版本过几年就不会再维护了&#xff0c;6.x将成为主流。 入门 引入依赖 <dependency><groupId>org.springframework.boot</groupId><arti…

CMS Made Simple v2.2.15 远程命令执行漏洞(CVE-2022-23906)

前言 CVE-2022-23906 是一个远程命令执行&#xff08;RCE&#xff09;漏洞&#xff0c;存在于 CMS Made Simple v2.2.15 中。该漏洞通过上传头像功能进行利用&#xff0c;攻击者可以上传一个经过特殊构造的图片文件来触发漏洞。 漏洞详情 CMS Made Simple v2.2.15 中的头像上…

【C++/STL】优先级队列的介绍与模拟实现仿函数

✨ 万物与我皆是自由诗 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1…

关于string的‘\0‘与string,vector构造特点加部分特别知识点的讨论

目录 前言&#xff1a; 问题一&#xff1a;关于string的\0问题讨论 问题二&#xff1a;C标准库中的string内存是分配在堆上面吗&#xff1f; 问题三&#xff1a;string与vector的capacity大小设计的特点 问题四&#xff1a;string的流提取问题 问题五&#xff1a;迭代器失…

unity 使用UnityWebRequest从服务器下载

IEnumerator WinFile(string url){//连接urlusing(UnityWebRequest uwr UnityWebRequest.Get(url)){//等待下载yield return uwr.SendWebRequest();//判断是否连接失败以及是否返回一个错误状态码if (uwr.result UnityWebRequest.Result.ConnectionError || uwr.result Unit…

04.ffmpeg打印音视频媒体信息

目录 1、相关头文件 2、相关结构体 3、相关函数 4、函数详解 5、源码附上 1、相关头文件 #include <libavformat/avformat.h> 包含格式相关的函数和数据结构 #include <libavutil/avutil.h> 包含一些通用实用函数 2、相关结构体 AV…

【PWN · ret2syscall | GoPwn】[2024CISCN · 华中赛区]go_note

一道GoPwn&#xff0c;此外便是ret2syscall的利用。然而过程有不小的曲折&#xff0c;参考 返璞归真 师傅的wp&#xff0c;堪堪完成了复现。复现过程中&#xff0c;师傅也灰常热情回答我菜菜的疑问&#xff0c;感谢&#xff01;2024全国大学生信息安全竞赛&#xff08;ciscn&am…

RabbitMQ快速入门 - 图像化界面的简单操作

目录 1、RabbitMQ的安装 2、RabbitMQ基本介绍 3、简单案例 4、数据隔离 1、RabbitMQ的安装 官网链接&#xff1a;rabbitmq官网 &#xff08;官网很详细&#xff0c;也可以在官网学习啦~&#xff09; 基础入门&#xff1a;自主学习&#xff1a;最新版本&#xff1a;安装我…

缓存-缓存的使用与基本详解

1.缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。而db承担数据落盘工作。 哪些数据适合放入缓存&#xff1f; 即时性、数据一致性要求不高的访问量大且更新频率不高的数据&#xff08;读多&#xff0c;写少&#xff09; …

如何配置 PostgreSQL 以实现高可用性和故障转移?

文章目录 一、高可用性和故障转移的概念&#xff08;一&#xff09;数据复制&#xff08;二&#xff09;监控和检测&#xff08;三&#xff09;快速切换 二、实现高可用性和故障转移的技术方案&#xff08;一&#xff09;流复制&#xff08;Streaming Replication&#xff09;&…

轻松创建对象——简单工厂模式(Java实现)

1. 引言 大家好&#xff0c;又见面了&#xff01;在上一篇文章中&#xff0c;我们通过Python示例介绍了简单工厂模式&#xff0c;今天&#xff0c;我们继续深入这个话题&#xff0c;用Java来实现简单工厂模式。 2. 什么是简单工厂模式 简单工厂模式&#xff08;Simple Facto…