數據結構刷題之貪心算法

貪心算法(Greedy Algorithm)

是一種在每個步驟中都選擇當前最優解的算法設計策略。它通常用于解決優化問題,例如最小化成本或最大化收益。貪心算法的核心思想是:在每一步選擇中,都做出局部最優的選擇,希望最終能得到全局最優解。

貪心算法的特點

貪心選擇性質:
一個問題的整體最優解可以通過一系列局部最優選擇來構造。
每次選擇只依賴于當前狀態,而不考慮未來的影響。
最優子結構性質:
一個問題的最優解包含其子問題的最優解。
簡單高效:
貪心算法通常比動態規劃等方法更簡單、更高效,但適用范圍有限。

經典題目

1.找零問題
給定不同面額的硬幣和一個總金額,要求使用最少數量的硬幣湊出該金額。
分析一下這個問題:這種問題肯定是先使用大的去找,大的找不完采用曉得,典型的局部最優解–>整體最優解
思路先用大的找->再用小的找

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int minCoins(vector<int>& coins, int amount) {// 對硬幣面額從大到小排序sort(coins.begin(), coins.end(), greater<int>());int count = 0; // 記錄硬幣數量for (int coin : coins) {if (amount == 0) break; // 如果金額為 0,結束循環count += amount / coin; // 使用當前面額的硬幣盡可能多amount %= coin;         // 更新剩余金額}return amount == 0 ? count : -1; // 如果無法找零,返回 -1
}int main() {vector<int> coins = {1, 5, 10, 25}; // 硬幣面額int amount;cout << "請輸入總金額: ";cin >> amount;int result = minCoins(coins, amount);if (result != -1) {cout << "最少需要 " << result << " 枚硬幣。" << endl;} else {cout << "無法找零。" << endl;}return 0;
}```
2. 活動選擇問題
給定一組活動及其開始時間和結束時間,求最多能參加多少個不重疊的活動。
對于活動選擇問題,貪心策略通常是優先選擇結束時間最早的活動。原因如下:
如果一個活動的結束時間較早,那么它留下的時間窗口就更大,從而為后續活動提供了更多可能的選擇。
這種策略確保每次選擇都盡可能地為后續活動騰出空間,從而最大化可參加的活動數量。
```cpp
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;struct Activity {int start, end;
};// 按照活動結束時間排序
bool compare(Activity a, Activity b) {return a.end < b.end;
}int maxActivities(vector<Activity>& activities) {// 按結束時間排序sort(activities.begin(), activities.end(), compare);int count = 1; // 至少可以選擇第一個活動int lastEnd = activities[0].end;for (int i = 1; i < activities.size(); ++i) {if (activities[i].start >= lastEnd) { // 如果當前活動與上一個活動不沖突count++;lastEnd = activities[i].end; // 更新最后一個活動的結束時間}}return count;
}int main() {vector<Activity> activities = {{1, 3}, {2, 5}, {4, 7}, {6, 9}};cout << "最多可以參加 " << maxActivities(activities) << " 個活動。" << endl;return 0;
}
  1. 分糖果問題
    有若干孩子和糖果,每個孩子有一個貪婪因子(表示至少需要多少糖果才能滿足),每個糖果有一個大小。問最多能滿足多少孩子?
    策略:
    優先滿足需求最小的孩子:因為需求小的孩子更容易被滿足,這樣可以騰出更多較大的糖果來滿足其他孩子。
    優先使用最小的糖果:因為較小的糖果可能無法滿足需求大的孩子,但可以滿足需求小的孩子。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int findContentChildren(vector<int>& g, vector<int>& s) {// 對孩子的貪婪因子和糖果大小進行排序sort(g.begin(), g.end());sort(s.begin(), s.end());int child = 0, cookie = 0;while (child < g.size() && cookie < s.size()) {if (s[cookie] >= g[child]) { // 如果當前糖果可以滿足孩子child++; // 滿足的孩子數加 1}cookie++; // 移動到下一個糖果}return child; // 返回滿足的孩子數
}int main() {vector<int> g = {1, 2, 3}; // 孩子的貪婪因子vector<int> s = {1, 1};    // 糖果的大小cout << "最多可以滿足 " << findContentChildren(g, s) << " 個孩子。" << endl;return 0;
}
  1. 最優裝載問題
    有一艘船,載重量為 W,有若干貨物,每個貨物有重量 w[i]。求最多能裝多少貨物。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int maxLoad(vector<int>& weights, int W) {// 按貨物重量從小到大排序sort(weights.begin(), weights.end());int count = 0; // 記錄裝入的貨物數量for (int weight : weights) {if (W >= weight) { // 如果還能裝下當前貨物count++;W -= weight; // 更新剩余載重量} else {break;}}return count;
}int main() {vector<int> weights = {4, 8, 1, 5, 2}; // 貨物重量int W;cout << "請輸入船的最大載重量: ";cin >> W;cout << "最多可以裝載 " << maxLoad(weights, W) << " 件貨物。" << endl;return 0;
}

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

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

相關文章

重新定義PPT創作!ChatPPT發布全球首個AI PPT專用MCP Server

在這個AI技術日新月異的時代&#xff0c;ChatPPT團隊推出革命性的MCP Server&#xff08;Multimodal Collaboration Platform&#xff09;&#xff0c;這是全球首個專注于AI PPT生成領域的智能協作平臺。該平臺的誕生&#xff0c;標志著PPT創作正式邁入"智能協作"新紀…

未來蓉城:科技與生態共舞的詩意棲居-成都

故事背景 故事發生在中國四川成都的2075年&#xff0c;展現科技與自然深度交融的未來城市圖景。通過六個充滿想象力的生態裝置場景&#xff0c;描繪市民在智慧城市中詩意棲居的生活狀態&#xff0c;展現環境保護與人文傳承的和諧共生。 故事內容 在電子竹林輕軌站&#xff0c;通…

計算機網絡筆記-分組交換網中的時延

一、分組交換網絡中的四種時延類型 1. 排隊時延 在隊列中&#xff0c;當分組在鏈路上等著被傳輸時的時延為排隊時延&#xff0c;一個分組的排隊時延長度取決于該分組前方等待傳輸的分組數量&#xff0c;如果排隊隊列為空&#xff0c;且沒有正在傳輸的分組那么該分組的排隊時延…

ubuntu20.04.6LTS 安裝PCL 1.9.1

在虛擬機中&#xff0c;ubuntu20.04.6 LTS 安裝PCL 1.9.1&#xff0c;實測成功了。 注意&#xff1a; 1、編譯時選擇雙核&#xff0c;否則編譯到一半報錯&#xff0c;因為內存不夠進程被殺死。 虛擬機是4核心、內存8G。可能選3核更快一點&#xff0c;雙核編譯了2個多小時。 …

SQL:JOIN 完全指南:從基礎到實戰應用

JOIN 是 SQL 中最重要也最常用的操作之一&#xff0c;它允許我們從多個表中獲取關聯數據。本文將全面解析 SQL 中的各種 JOIN 類型&#xff0c;包括 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 以及 CROSS JOIN&#xff0c;并通過實際示例展示它們的應用場景。 一、JOIN 基…

IDEA 2024 Maven 設置為全局本地倉庫,避免新建項目重新配置maven

使用idea創建Java項目時每次都要重新配置Maven&#xff0c;非常麻煩。其實IDEA可以配置全局Maven。方法如下&#xff1a; 1.關閉所有項目進入初始頁面 2.選擇所有配置 3.設置為自己的路徑

UDP怎么樣實現可靠傳輸?

如果需要在基于UDP的應用中實現可靠傳輸&#xff08;例如確保數據不丟失、按順序到達等&#xff09;&#xff0c;通常需要在應用層實現相應的機制。 1. 確認應答機制 應用層可以使用確認應答機制來確保數據的可靠傳輸。當發送方發送一個數據包時&#xff0c;接收方收到數據包…

【CSS基礎】- 02(emmet語法、復合選擇器、顯示模式、背景標簽)

css第二天 一、emmet語法 1、簡介 ? Emmet語法的前身是Zen coding,它使用縮寫,來提高html/css的編寫速度, Vscode內部已經集成該語法。 ? 快速生成HTML結構語法 ? 快速生成CSS樣式語法 2、快速生成HTML結構語法 生成標簽 直接輸入標簽名 按tab鍵即可 比如 div 然后tab…

每日算法:洛谷U535992 J-C 小夢的寶石收集(雙指針、二分)

題目描述 小夢有 n 顆能量寶石&#xff0c;其中第 i 顆的能量為 ai?&#xff0c;但這些能量寶石十分不穩定&#xff0c;隨時有可能發生崩壞&#xff0c;導致他們全部消失&#xff01; 小夢想要留住寶石們&#xff0c;不希望他們發生崩壞&#xff0c;同時他發現&#xff1a;如…

Spring MVC 邏輯視圖(JSP、Thymeleaf、FreeMarker)與非邏輯視圖(JSON、Excel、PDF、XML)詳解及示例

Spring MVC 邏輯視圖與非邏輯視圖詳解及示例 一、邏輯視圖與非邏輯視圖的定義 類型定義邏輯視圖通過視圖解析器&#xff08;ViewResolver&#xff09;將邏輯名稱&#xff08;如 success&#xff09;映射到具體視圖實現。非邏輯視圖直接返回具體視圖對象&#xff08;如 JsonVie…

【AAOS】【源碼分析】CarAudioService(二)-- 功能介紹

汽車音頻是 Android 汽車操作系統 (AAOS) 的一項功能,允許車輛播放信息娛樂聲音,例如媒體、導航和通信。AAOS 不負責具有嚴格可用性和時間要求的鈴聲和警告,因為這些聲音通常由車輛的硬件處理。將汽車音頻服務集成在汽車中,徹底改變了駕駛體驗,為駕駛員和乘客提供了音樂、…

docker安裝軟件匯總(持續更新)

1、簡介 本文介紹一些常用的軟件通過docker安裝并啟動&#xff0c;持續更新。 2、docker安裝軟件 2.1、zookeeper & kafka # 1、拉取zookeeper鏡像 git pull wurstmeister/zookeeper # 2、啟動zookeeper容器 docker run -d --restartalways --log-driver json-file --lo…

MySQL的左連接、右連接、內連接、外連接

一、前言 MySQL中的左連接、右連接、內連接和全外連接是用于多表關聯查詢的核心操作。 二、內連接&#xff08;INNER JOIN&#xff09; 定義&#xff1a;返回兩個表中完全匹配的行&#xff0c;即只保留兩個表連接字段值相等的行。示例場景&#xff1a;查詢所有有選課記錄的學…

前端面試寶典---數據類型

基本數據類型 對于基本類型在創建時無需使用 new 關鍵字 Bigint在實際開發不常用&#xff0c;如果對于精度要求高可以使用第三方庫&#xff0c;如decimal.js 基本數據類型介紹 undefined&#xff1a;當變量被聲明但未賦值&#xff0c;或者函數沒有返回值時&#xff0c;就會呈現…

Lua 函數使用的完整指南

在 Lua 中&#xff0c;函數是一等公民&#xff08;First-Class Citizen&#xff09;&#xff0c;這意味著函數可以像其他值一樣被賦值、傳遞和操作。以下是 Lua 函數定義的完整指南&#xff0c;涵蓋基礎語法、高級特性、設計模式及性能優化。 在Lua 中&#xff0c;函數定義的完…

使用StockTV API對接印度金融市場數據全指南:K線、實時行情與IPO新股

一、印度金融市場數據特點 印度作為全球增長最快的主要經濟體之一&#xff0c;其金融市場具有以下顯著特征&#xff1a; 雙交易所體系&#xff1a;國家證券交易所(NSE)和孟買證券交易所(BSE)高流動性品種&#xff1a;Nifty 50指數成分股、銀行股等獨特交易機制&#xff1a;T2…

2021-10-26 C++繁忙通信兵

緣由繁忙的通訊兵&#xff0c;可以解決一下嗎-編程語言-CSDN問答 void 繁忙通信兵() {//緣由https://ask.csdn.net/questions/7544401?spm1005.2025.3001.5141int a 200, s1 8, s2 5, s3 45, p 0, n 0, c 0;std::cin >> n;while (a > n){a - s1 s2;if (a &l…

【Linux】進程控制:創建、終止、等待與替換全解析

文章目錄 前言一、重談進程創建二、進程終止2.1 正常終止的退出碼機制2.2 異常終止的信號機制2.3 進程常見的退出方法 三、進程等待&#xff1a;避免僵尸進程的關鍵3.1 進程等待的必要性3.2 進程等待的兩個系統調用接口3.2.1 wait()3.2.2 waitpid()區別 四、進程程序替換4.1 進…

基于Redis實現短信防轟炸的Java解決方案

基于Redis實現短信防轟炸的Java解決方案 前言 在當今互聯網應用中&#xff0c;短信驗證碼已成為身份驗證的重要手段。然而&#xff0c;這也帶來了"短信轟炸"的安全風險 - 惡意用戶利用程序自動化發送大量短信請求&#xff0c;導致用戶被騷擾和企業短信成本激增。本…

【后端開發】Spring MVC-常見使用、Cookie、Session

文章目錄 代碼總結初始化--RestController、RequestMapping傳遞參數單參數多參數 傳遞對象后端參數重命名&#xff08;后端參數映射&#xff09;--RequestParam必傳參數設置非必傳參數 傳遞數組傳遞集合傳遞JSON數據JSON語法JSON格式轉換JSON優點傳遞JSON對象 獲取URL中參數--P…