貪心算法-以高校教材管理系統為例

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`:用于自定義排序邏輯,這里用于根據學校的需求進行排序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42798.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42798.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42798.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pix4Dmapper:無人機測繪的革命性工具

在現代測繪和地理信息系統&#xff08;GIS&#xff09;領域&#xff0c;Pix4Dmapper無疑是一款革命性的工具。作為一名長期使用這款軟件的用戶&#xff0c;我深深感受到它在工作中的重要性和便利性。Pix4Dmapper不僅僅是一款軟件&#xff0c;更是測繪工作者的得力助手&#xff…

285個地級市出口產品質量及技術復雜度(2011-2021年)

出口產品質量與技術復雜度&#xff1a;衡量國家競爭力的關鍵指標 出口產品質量是衡量國內企業生產的產品在國際市場上競爭力的重要標準。它不僅要求產品符合國際標準和目標市場的法律法規&#xff0c;而且需要保證產品質量的穩定性和可靠性。而出口技術復雜度則進一步體現了一…

新一代信息技術及應用

關于云計算的描述不正確的是&#xff08; &#xff09;。 A 云計算可以通過網絡連接&#xff0c;用戶通過網絡接入“云”中并獲得有關的服務&#xff0c;“云”內節點之間也通過內部的網絡相連 B 云計算可以快速、按需、彈性服務&#xff0c;用戶可以按照實際需求迅速獲取或釋放…

[Python學習篇] Python面向對象——類

面向對象是什么&#xff1f; 面向對象&#xff08;Object-Oriented Programming&#xff0c;簡稱OOP&#xff09;是一種編程范式&#xff0c;它使用“對象”來設計應用程序和計算機程序。OOP的核心概念包括類&#xff08;Class&#xff09;、對象&#xff08;Object&#xff09…

批量下載手機中APP程序中文件

需求 利用 adb pull 下載手機中app的某目錄 adb pull 命令本身不支持直接下載整個目錄&#xff08;文件夾&#xff09;及其所有子目錄和文件作為一個單一的操作。但是&#xff0c;可以通過一些方法來間接實現這一目的。 方法 1. 首先將要下載的目錄進行 tar 打包 # 在 And…

Python面試題:Python 中的 `property` 函數有什么用?

在 Python 中&#xff0c;property 函數用于創建和管理類中的屬性。它允許你將方法轉換為屬性&#xff0c;這樣你可以像訪問變量一樣訪問這些方法。這對于控制屬性的訪問和修改非常有用&#xff0c;因為它允許你在屬性訪問時執行額外的邏輯&#xff08;如驗證或計算&#xff09…

光通信領域常見的會議和期刊總結

在高速光通信小組待了一年&#xff0c;對我們領域主要的會議和期刊也有了一定的了解&#xff0c;所以總結一下我們可以投的期刊或會議有哪些。會議一般有OFC、ECOC、CLEO、OECC、ACP等&#xff0c;期刊則有OE、OL、PTL、JLT、PJ、AO、JOSA等&#xff0c;下面簡單介紹一下。 先…

【atcoder】習題——位元枚舉

題意&#xff1a;求i&M的popcount的和&#xff0c;i屬于0……N 主要思路還是變加為乘。 舉個例子N22&#xff0c;即10110 假設M的第3位是1&#xff0c;分析N中&#xff1a; 00110 00111 00100 00101 發現其實等價于 0010 0011 0000 0001 也就是左邊第4位和第5…

算法學習筆記(8.1)-動態規劃入門

目錄 問題特性&#xff1a; 最優子結構&#xff1a; 代碼示例&#xff1a;&#xff08;動態規劃最優子結構&#xff09; 上述最小代價爬樓梯的運行過程&#xff1a; 代碼示例&#xff1a; 無后效性&#xff1a; 解析&#xff1a; 具體過程圖示如下&#xff1a; 具體的…

如何為IP申請SSL證書

目錄 以下是如何輕松為IP地址申請SSL證書的詳細步驟&#xff1a; 申請IP證書的基本條件&#xff1a; 申請IP SSL證書的方式&#xff1a; 確保網絡通信安全的核心要素之一&#xff0c;是有效利用SSL證書來加密數據傳輸&#xff0c;特別是對于那些直接通過IP地址訪問的資源。I…

使用 Azure DevOps Pipelines 生成 .NET Core WebJob 控制臺應用 CI/CD

Web 應用程序通常需要作為后臺任務運行的進程&#xff0c;并在特定時間間隔進行計劃或在事件中觸發。它們不需要花哨的 IO 接口&#xff0c;因為重點是過程而不是輸出。Azure WebJobs 提供了出色的支持&#xff0c;通常在云環境中通過 Web 控制臺應用程序來實現此目的。WebJob …

企業數字化轉型中的低代碼開發平臺應用:釋放創新潛能

隨著信息技術的飛速發展&#xff0c;企業數字化轉型已成為行業趨勢。在這場轉型浪潮中&#xff0c;低代碼開發平臺以其獨特的優勢&#xff0c;成為眾多企業實現快速迭代、高效創新的得力助手。本文將深入探討低代碼開發平臺在企業數字化轉型中的應用&#xff0c;以及如何幫助企…

Mac平臺虛擬機 Parallels Desktop v19.4.1,支持M1/M2/M3芯片組

Parallels Desktop for Mac是功能強大靈活度高的虛擬化方案&#xff0c;無需重啟即可在同一臺電腦上隨時訪問Windows和Mac兩個系統上的眾多應用程序。從僅限于PC的游戲到生產力軟件&#xff0c;Parallels Desktop都能幫您實現便捷使用。Parallels Desktop 是一款專業的Mac虛擬機…

Docker搭建kafka+zookeeper以及Springboot集成kafka快速入門

參考文章 【Docker安裝部署KafkaZookeeper詳細教程】_linux arm docker安裝kafka-CSDN博客 Docker搭建kafkazookeeper 打開我們的docker的鏡像源配置 vim /etc/docker/daemon.json 配置 { "registry-mirrors": ["https://widlhm9p.mirror.aliyuncs.com"…

vue父子組件通信實現模糊搜索功能

我遇到的問題&#xff1a; 我的搜索框在父頁面&#xff0c;靜態數據都在子頁面。怎么實現模糊查詢數據&#xff1f; 昨天的嘗試&#xff1a;先把搜索的內容數據存到session里&#xff0c;然后從session里拿&#xff0c; 結果&#xff1a;存是存進去了&#xff0c;卻拿不到。應…

Django學習收尾

啟動項目命令 python manage.py runserver 文件上傳功能實現 title "Form上傳"if request.method "GET":form UpForm()return render(request, upload_form.html, {"form": form, "title": title})form UpForm(datarequest.POS…

Java對象創建究竟是在棧上還是堆上??

在 Java 中&#xff0c;對象的創建通常情況下是在堆上。 基本數據類型&#xff08;如 byte、short、int、long、float、double、char&#xff09;在方法內聲明時&#xff0c;其值會存儲在棧上。除了基本數據類型之外的所有對象&#xff0c;都是由 Java 虛擬機&#xff08;JVM&…

python入門基礎知識·二

""" # Python介紹 # Python注釋 # 單行注釋&#xff1a; # # 多行注釋&#xff1a; r """""" # Python輸出和輸入 # print: 輸出 # input: 輸入 ①會讓程序暫停&#xff0c;②得到的是字符串內容 int(&…

Linux Mac 安裝Higress 平替 Spring Cloud Gateway

Linux Mac 安裝Higress 平替 Spring Cloud Gateway Higress是什么?傳統網關分類Higress定位下載安裝包執行安裝命令執行腳本 安裝成功打開管理界面使用方法configure.shreset.shstartup.shshutdown.shstatus.shlogs.sh Higress官網 Higress是什么? Higress是基于阿里內部的…

Vue指令詳解與實操運用 - 編程魔法

在Vue.js的世界里&#xff0c;指令就像是一位魔法師&#xff0c;它們能夠賦予HTML元素以生命&#xff0c;讓網頁與用戶互動起來。今天&#xff0c;我們就來揭開這些指令的神秘面紗&#xff0c;看看它們是如何在我們的日常開發中發揮作用的。 1. v-text 和 v-html - 文字與內容的…