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

1.贪心算法介绍

1.算法思路

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

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

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

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

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

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

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

2.代码介绍

java 复制代码
    /**
     * 为指定学生推荐最合适的课程。
     * @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` 服务层对象,用于获取学生和课程信息。
  1. 用户输入处理:
  • 程序首先提示用户输入一个学生ID,然后使用 `Scanner` 对象读取这个输入值。
  1. 学生信息获取:
  • 使用 `studentService.getStudentById(studentID)` 方法根据学生ID获取学生信息。如果学生不存在,打印提示信息并结束方法执行。
  1. 课程列表获取:
  • 调用 `courseService.listAllCourses()` 获取所有可用的课程列表。如果没有课程信息,同样打印提示信息并结束方法执行。
  1. 推荐逻辑:
  • 通过调用 `findBestCourse` 方法使用贪心算法为学生推荐最合适的课程。
  1. 贪心算法实现:
  • `findBestCourse` 方法遍历所有课程,并通过 `calculateCourseScore` 方法为每个课程计算一个得分。选择得分最高的课程作为最佳推荐。
  1. 得分计算:
  • `calculateCourseScore` 方法定义了课程得分的计算逻辑。在这个例子中,得分基于两个因素:课程的学分和学生是否已修过该课程。学分越高得分越高,如果学生未修过该课程则额外加分。
  1. 推荐结果输出:
  • 如果找到最佳课程,打印出课程名称、课程ID和学分信息。如果没有合适的课程,打印相应的提示信息。
相关推荐
sp_fyf_202426 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh2 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
Tisfy2 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java2 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli2 小时前
滑动窗口->dd爱框框
算法
丶Darling.2 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo5203 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng19913 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂3 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知3 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表