【算法筆記】貪心算法

一、什么是貪心算法?

貪心算法是一種在每一步選擇中都采取當前看起來最優(最“貪心”)的策略,從而希望得到全局最優解的算法設計思想。

  • 核心思想:每一步都做出局部最優選擇,不回退。
  • 適用場景:問題具有最優子結構且滿足貪心選擇性質 —— 即局部最優可以導出全局最優。

二、貪心算法的典型流程

  1. 排序/預處理:對待選元素進行必要的排序或組織。
  2. 局部選擇:按照某種規則(如最大收益、最小代價等)依次選取元素。
  3. 可行性檢驗:檢查當前選擇是否滿足約束。
  4. 解的構造:在每次選擇的基礎上逐步構建最終解。

三、經典例題回顧

1. 活動選擇問題

  • 題目:有 n n n 個活動,每個活動有開始時間 s i s_i si? 和結束時間 f i f_i fi?,要求選出最多互不沖突的活動集合。
  • 貪心策略:按活動結束時間從小到大排序,每次選取結束最早且與當前已選活動不沖突的活動。

2. 分數背包問題(Fractional Knapsack)

  • 題目:有 n n n 件物品,每件物品重量 w i w_i wi?,價值 v i v_i vi?,背包容量 W W W。物品可分割裝入。
  • 貪心策略:按單位重量價值 v i w i \frac{v_i}{w_i} wi?vi?? 從大到小裝入;裝不下時裝入盡可能多的部分。

3. 最小生成樹(Kruskal 算法)

  • 題目:給定帶權無向圖,求一棵權值之和最小的生成樹。
  • 貪心策略:對所有邊按權值從小到大排序,依次加入不會形成環的最小邊。

四、實戰題目 —— 給 n n n 個國家加稅

4.1 題目描述

  • n n n 個國家,初始關稅稅率均為 100%。
  • 對第 i i i 個國家,加稅一次可將其稅率提升 p i % p_i\% pi?%(即稅率從上一次的值再加上 p i p_i pi? 百分點)。
  • 允許一共進行 k k k 次加稅操作,每次只能選擇一個國家進行一次加稅。
  • 求經過 k k k 次加稅后,所有國家稅率的累乘(乘積)的最大值。

示例

輸入:n = 3, p = [2, 5, 3], k = 4  
輸出:最大乘積(按百分比計算)

4.2 貪心思路分析

收益定義
  • 對第 i i i 個國家當前稅率 t i t_i ti?(最開始 t i = 100 % t_i=100\% ti?=100%)再加一次 p i % p_i\% pi?%,其新的稅率為 t i + p i t_i + p_i ti?+pi?
  • 在乘積中,相當于將當前乘積乘以 t i + p i t i \frac{t_i + p_i}{t_i} ti?ti?+pi??,因此這次操作對總乘積的放大倍數為:

r i = t i + p i t i = 1 + p i t i r_i = \frac{t_i + p_i}{t_i} = 1 + \frac{p_i}{t_i} ri?=ti?ti?+pi??=1+ti?pi??

  • 要使乘積最大,每次都應選擇能帶來最大放大倍數 r i r_i ri? 的國家。
優先隊列實現
  • 使用一個最大堆(priority_queue)存儲每個國家當前可獲得的放大倍數 r i r_i ri?
  • 每次取出堆頂( r i r_i ri? 最大的國家),實施一次加稅:
    1. 更新該國家稅率: t i ← t i + p i t_i \leftarrow t_i + p_i ti?ti?+pi?
    2. 計算新的放大倍數: r i ← 1 + p i t i r_i \leftarrow 1 + \frac{p_i}{t_i} ri?1+ti?pi??
    3. 將更新后的 r i r_i ri? 重新壓入堆中。
  • 重復上述過程 k k k 次,結束后遍歷所有國家稅率,計算乘積。

4.3 代碼示例(C++)

#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, k;cin >> n >> k;vector<double> p(n), t(n, 100.0);for (int i = 0; i < n; i++) {cin >> p[i];}// 優先隊列:pair<放大倍數, 國家索引>auto cmp = [](const pair<double,int>& a, const pair<double,int>& b) {return a.first < b.first;};priority_queue<pair<double,int>, vector<pair<double,int>>, decltype(cmp)> pq(cmp);// 初始化for (int i = 0; i < n; i++) {double r = 1.0 + p[i] / t[i];pq.push({r, i});}// 執行 k 次加稅while (k--) {auto [r, i] = pq.top(); pq.pop();t[i] += p[i];r = 1.0 + p[i] / t[i];pq.push({r, i});}// 計算累乘結果double ans = 1.0;for (double tax : t) {ans *= tax / 100.0;}cout << fixed << setprecision(6) << ans << "\n";return 0;
}

4.4 復雜度分析

  • 每次操作:彈出堆頂 + 插入堆頂,各 O ( log ? n ) O(\log n) O(logn)
  • 總共 k k k 次操作,時間復雜度為: O ( k log ? n ) O(k \log n) O(klogn)
  • 空間復雜度:需要存儲 n n n 個國家的信息,為 O ( n ) O(n) O(n)

五、更多貪心練習題推薦

  1. 區間染色問題:給定區間集合,最少使用多少種顏色使重疊區間不同色?
  2. 跳躍游戲 II:每格有最大跳躍長度,求最少跳躍次數到達末尾。
  3. 分配餅干:孩子有滿足度,餅干有大小,如何讓最多孩子滿足?
  4. 連通區間合并:給一堆區間,合并所有重疊區間,輸出不重疊區間集合。

六、小結

  • 貪心算法以“當前最優選擇”逐步構建解,適合于“最優子結構”且滿足“貪心選擇性質”的問題。
  • 真正的難點在于如何證明局部最優能導出全局最優,以及如何設計合適的貪心策略
  • 通過上述“加稅”題,以及經典例題的練習,可以加深對貪心算法的理解與應用。

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

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

相關文章

現代c++獲取linux所有的網絡接口名稱

現代c獲取linux所有的網絡接口名稱 前言一、在linux中查看網絡接口名稱二、使用c代碼獲取三、驗證四、完整代碼如下五、總結 前言 本文介紹一種使用c獲取本地所有網絡接口名稱的方法。 一、在linux中查看網絡接口名稱 在linux系統中可以使用ifconfig -a命令列舉出本機所有網絡…

打印及判斷回文數組、打印N階數組、蛇形矩陣

打印回文數組 1 1 1 1 1 1 2 2 2 1 1 2 3 2 1 1 2 2 2 1 1 1 1 1 1方法1&#xff1a; 對角線對稱 左上和右下是對稱的。 所以先考慮左上打印&#xff0c; m i n ( i 1 , j 1 ) \text min(i1,j1) min(i1,j1)&#xff0c;打印出來&#xff1a; 1 1 1 1 1 2 2 2 1 2 3 3 1 2 …

詳解UnityWebRequest類

什么是UnityWebRequest類 UnityWebRequest 是 Unity 引擎中用于處理網絡請求的一個強大類&#xff0c;它可以讓你在 Unity 項目里方便地與網絡資源進行交互&#xff0c;像發送 HTTP 請求、下載文件等操作都能實現。下面會詳細介紹 UnityWebRequest 的相關內容。 UnityWebRequ…

UE5 在旋轉A的基礎上執行旋轉B

用徑向slider實現模型旋轉時&#xff0c;得到的結果與ue編輯器里面的結果有很大出入。 問題應該是 兩個FRotator&#xff08;0&#xff0c;10&#xff0c;0&#xff09;和&#xff08;10&#xff0c;20&#xff0c;30&#xff09;&#xff0c; 兩個FRotator的加法結果為&…

4.2 Prompt工程與任務建模:高效提示詞設計與任務拆解方法

提示詞工程&#xff08;Prompt Engineering&#xff09;和任務建模&#xff08;Task Modeling&#xff09;已成為構建高效智能代理&#xff08;Agent&#xff09;系統的核心技術。提示詞工程通過精心設計的自然語言提示詞&#xff08;Prompts&#xff09;&#xff0c;引導大型語…

MySQL 索引的最左前綴匹配原則是什么?

MySQL 索引的最左前綴匹配原則詳解 最左前綴匹配原則&#xff08;Leftmost Prefix Principle&#xff09;是 MySQL 復合索引&#xff08;聯合索引&#xff09;查詢優化中的核心規則&#xff0c;理解這一原則對于高效使用索引至關重要。 核心概念 定義&#xff1a;當查詢條件…

SQL命令

一、控制臺中查詢命令 默認端口號&#xff1a;3306 查看服務器版本: mysql –version 啟動MySQL服務&#xff1a;net start mysql 登錄數據庫&#xff1a;mysql -u root -p 查看當前系統下的數據庫&#xff1a;show databases&#xff1b; 創建數據庫&#xff1a;create…

新增 29 個專業,科技成為關鍵賽道!

近日&#xff0c;教育部正式發布《普通高等學校本科專業目錄&#xff08;2025年&#xff09;》&#xff0c;新增 29 個本科專業&#xff0c;包括區域國別學、碳中和科學與工程、海洋科學與技術、健康與醫療保障、智能分子工程、醫療器械與裝備工程、時空信息工程、國際郵輪管理…

零基礎上手Python數據分析 (23):NumPy 數值計算基礎 - 數據分析的加速“引擎”

寫在前面 —— 超越原生 Python 列表,解鎖高性能數值計算,深入理解 Pandas 的底層依賴 在前面一系列關于 Pandas 的學習中,我們已經領略了其在數據處理和分析方面的強大威力。我們學會了使用 DataFrame 和 Series 來高效地操作表格數據。但是,你是否好奇,Pandas 為何能夠…

Android 13.0 MTK Camera2 設置默認拍照尺寸功能實現

Android 13.0 MTK Camera2 設置默認拍照尺寸功能實現 文章目錄 需求&#xff1a;參考資料架構圖了解Camera相關專欄零散知識了解部分相機源碼參考&#xff0c;學習API使用&#xff0c;梳理流程&#xff0c;偏應用層Camera2 系統相關 修改文件-修改方案修改文件&#xff1a;修改…

HarmonyOS 框架基礎知識

參考文檔&#xff1a;HarmonyOS開發者文檔 第三方庫&#xff1a;OpenHarmony三方庫中心倉 基礎特性 Entry&#xff1a;關鍵裝飾器 Components&#xff1a;組件 特性EntryComponent??作用范圍僅用于頁面入口可定義任意可復用組件??數量限制??每個頁面有且僅有一個無數量…

前端分頁與瀑布流最佳實踐筆記 - React Antd 版

前端分頁與瀑布流最佳實踐筆記 - React Antd 版 1. 分頁與瀑布流對比 分頁&#xff08;Pagination&#xff09;瀑布流&#xff08;Infinite Scroll&#xff09;展示方式按頁分批加載&#xff0c;有明確頁碼控件滾動到底部時自動加載更多內容&#xff0c;無明顯分頁用戶控制用…

Linux網絡編程:TCP多進程/多線程并發服務器詳解

Linux網絡編程&#xff1a;TCP多進程/多線程并發服務器詳解 TCP并發服務器概述 在Linux網絡編程中&#xff0c;TCP服務器主要有三種并發模型&#xff1a; 多進程模型&#xff1a;為每個客戶端連接創建新進程多線程模型&#xff1a;為每個客戶端連接創建新線程I/O多路復用&am…

詳解springcloudalibaba采用prometheus+grafana實現服務監控

文章目錄 1.官網下載安裝 prometheus和grafana1.promethus2.grafana 2. 搭建springcloudalibaba集成prometheus、grafana1. 引入依賴,springboot3.2之后引入如下2. 在yml文件配置監控端點暴露配置3. 在當前啟動的應用代碼中添加&#xff0c;在prometheus顯示的時候附加當前應用…

數據分析1

一、常用數據處理模塊Numpy Numpy常用于高性能計算&#xff0c;在機器學習常常作為傳遞數據的容器。提供了兩種基本對象&#xff1a;ndarray、ufunc。 ndarray具有矢量算術運算和復雜廣播能力的快速且節省空間的多維數組。 ufunc提供了對數組快速運算的標準數學函數。 ndar…

DeepSeek智能時空數據分析(六):大模型NL2SQL繪制城市之間連線

序言&#xff1a;時空數據分析很有用&#xff0c;但是GIS/時空數據庫技術門檻太高 時空數據分析在優化業務運營中至關重要&#xff0c;然而&#xff0c;三大挑戰仍制約其發展&#xff1a;技術門檻高&#xff0c;需融合GIS理論、SQL開發與時空數據庫等多領域知識&#xff1b;空…

2023ICPC合肥題解

文章目錄 F. Colorful Balloons(簽到)E. Matrix Distances(思維小結論)J. Takeout Delivering(最短路)G. Streak Manipulation(二分dp)C. Cyclic Substrings(回文自動機) 題目鏈接 F. Colorful Balloons(簽到) int n;cin>>n;for(int i1;i<n;i) cin>>s[i];map<…

數字技術驅動下教育生態重構:從信息化整合到數字化轉型的路徑探究

一、引言 &#xff08;一&#xff09;研究背景與問題提出 在當今時代&#xff0c;數字技術正以前所未有的速度和深度滲透到社會的各個領域&#xff0c;教育領域也不例外。從早期的教育信息化整合到如今的數字化轉型&#xff0c;教育系統正經歷著一場深刻的范式變革。 回顧教…

terraform 動態塊(Dynamic Blocks)詳解與實踐

在 Terraform 中&#xff0c;動態塊&#xff08;Dynamic Blocks&#xff09; 是一種強大的機制&#xff0c;允許你根據變量或表達式動態生成配置塊&#xff0c;避免重復編寫相似的代碼。這在處理需要重復定義的結構&#xff08;如資源參數、嵌套配置&#xff09;時特別有用。以…

Unity3D引擎框架及用戶接口調用方式相關分析及匯總

分析目的 目前外網3D手游絕大部基于Unity3D引擎進行開發,Unity3D引擎屬于商業引擎,引擎整理框架的運行機制較為神秘,本文介紹Unity引擎框架、對象組織方式、用戶接口與引擎交互方式等原理,通過本文的分析和介紹可了解Unity3D框架中大致執行原理。 實現原理 Unity引擎作為…