貪心算法——分數背包問題

一、背景介紹

給定𝑛個物品,第𝑖個物品的重量為𝑤𝑔𝑡[𝑖?1]、價值為𝑣𝑎𝑙[𝑖?1],和一個容量為𝑐𝑎𝑝的 背包。每個物品只能選擇一次,但可以選擇物品的一部分,價值根據選擇的重量比例計算,問:在不超過背包容量下背包中物品的最大價值。

如下圖所示,我們可以對物品任意地進行切分,并按照重量 比例來計算物品價值。

1. 對于物品𝑖,它在單位重量下的價值為𝑣𝑎𝑙[𝑖?1]/𝑤𝑔𝑡[𝑖?1],簡稱為單位價值

2. 假設放入一部分物品𝑖,重量為𝑤,則背包增加的價值為𝑤×𝑣𝑎𝑙[𝑖?1]/𝑤𝑔𝑡[𝑖?1]。

二、具體實現

1. 貪心策略確定

最大化背包內物品總價值,本質上是要最大化單位重量下的物品價值。由此便可推出下圖所示的貪心策略。

1)將物品按照單位價值從高到低進行排序。

2)遍歷所有物品,每輪貪心地選擇單位價值最高的物品。

3)若剩余背包容量不足,則使用當前物品的一部分填滿背包即可。

2.代碼實現

我們建立了一個物品類Item,以便將物品按照單位價值進行排序。循環進行貪心選擇,當背包已滿時跳出并 返回解。

class Item:"""物品"""def __init__(self, w: int, v: int):self.w = w  # 物品重量self.v = v  # 物品價值def fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:"""分數背包:貪心"""# 創建物品列表,包含兩個屬性:重量、價值items = [Item(w, v) for w, v in zip(wgt, val)]# 按照單位價值 item.v / item.w 從高到低進行排序items.sort(key=lambda item: item.v / item.w, reverse=True)# 循環貪心選擇res = 0for item in items:if item.w <= cap:# 若剩余容量充足,則將當前物品整個裝進背包res += item.vcap -= item.welse:# 若剩余容量不足,則將當前物品的一部分裝進背包res += (item.v / item.w) * cap# 已無剩余容量,因此跳出循環breakreturn res"""Driver Code"""
if __name__ == "__main__":wgt = [10, 20, 30, 40, 50]val = [50, 120, 150, 210, 240]cap = 50n = len(wgt)# 貪心算法res = fractional_knapsack(wgt, val, cap)print(f"不超過背包容量的最大物品價值為 {res}")

最差情況下,需要遍歷整個物品列表,因此時間復雜度為𝑂(𝑛),其中𝑛為物品數量。

由于初始化了一個Item對象列表,因此空間復雜度為𝑂(𝑛)

三、正確性證明

采用反證法

假設物品𝑥是單位價值最高的物品,使用某算法求得最大價值為res,但該解中不包含物品𝑥 。 現在從背包中拿出單位重量的任意物品,并替換為單位重量的物品𝑥。由于物品𝑥的單位價值最高,因此替 換后的總價值一定大于res。這與res是最優解矛盾,說明最優解中必須包含物品𝑥。 對于該解中的其他物品,我們也可以構建出上述矛盾。總而言之,單位價值更大的物品總是更優選擇,這說 明貪心策略是有效的。

如下圖所示,如果將物品重量和物品單位價值分別看作一個2D圖表的橫軸和縱軸,則分數背包問題可被轉化為“求在有限橫軸區間下的最大圍成面積”。這個類比可以幫助我們從幾何角度理解貪心策略的有效 性。

?

?

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

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

相關文章

《軟件工程》第 5 章 - 需求分析模型的表示

目錄 5.1需求分析與驗證 5.1.1 順序圖 5.1.2 通信圖 5.1.3 狀態圖 5.1.4 擴充機制 5.2 需求分析的過程模型 5.3 需求優先級分析 5.3.1 確定需求項優先級 5.3.2 排定用例分析的優先順序 5.4 用例分析 5.4.1 精化領域概念模型 5.4.2 設置分析類 5.4.3 構思分析類之間…

基于MATLAB的大規模MIMO信道仿真

1. 系統模型與參數設置 以下是一個單小區大規模MIMO系統的參數配置示例&#xff0c;適用于多發多收和單發單收場景。 % 參數配置 params.N_cell 1; % 小區數量&#xff08;單小區仿真&#xff09; params.cell_radius 500; % 小區半徑&#xff08;米&#xff09…

想查看或修改 MinIO 桶的匿名訪問權限(public/private/custom)

在 Ubuntu 下&#xff0c;如果你想查看或修改 MinIO 桶的匿名訪問權限&#xff08;public/private/custom&#xff09;&#xff0c;需要使用 mc anonymous 命令而不是 mc policy。以下是詳細操作指南&#xff1a; 1. 查看當前匿名訪問權限 mc anonymous get minio/test輸出示例…

HarmonyOS:相機選擇器

一、概述 相機選擇器提供相機拍照與錄制的能力。應用可選擇媒體類型實現拍照和錄制的功能。調用此類接口時&#xff0c;應用必須在界面UIAbility中調用&#xff0c;否則無法啟動cameraPicker應用。 說明 本模塊首批接口從API version 11開始支持。后續版本的新增接口&#xff0…

牛客AI簡歷篩選:提升招聘效率的智能解決方案

在競爭激烈的人才市場中&#xff0c;企業HR每天需處理海量簡歷&#xff0c;面臨篩選耗時長、標準不統一、誤判率高等痛點。牛客網推出的AI簡歷篩選工具&#xff0c;以“20分鐘處理1000份簡歷、準確率媲美真人HR”的高效表現&#xff0c;成為企業招聘的智能化利器。本文將深度解…

白楊SEO:做AI搜索優化的DeepSeek、豆包、Kimi、百度文心一言、騰訊元寶、通義、智譜、天工等AI生成內容信息采集主要來自哪?占比是多少?

大家好&#xff0c;我是白楊SEO&#xff0c;專注SEO十年以上&#xff0c;全網SEO流量實戰派&#xff0c;AI搜索優化研究者。 在開始寫之前&#xff0c;先說個抱歉。 上周在上海客戶以及線下聚會AI搜索優化分享說各大AI模型的聯網搜索是關閉的&#xff0c;最開始上來確實是的。…

QML與C++交互2

在QML與C的交互中&#xff0c;主要有兩種方式&#xff1a;在C中調用QML的方法和在QML中調用C的方法。以下是具體的實現方法。 在C中調用QML的方法 首先&#xff0c;我們需要在QML文件中定義一個函數&#xff0c;然后在C代碼中調用它。 示例 //QML main.qml文件 import QtQu…

OpenGL Chan視頻學習-8 How I Deal with Shaders in OpenGL

bilibili視頻鏈接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函數網站&#xff1a; docs.gl 說明&#xff1a; 1.之后就不再整理具體函數了&#xff0c;網站直接翻譯會更直觀也…

動態防御新紀元:AI如何重構DDoS攻防成本格局

1. 傳統高防IP的靜態瓶頸與成本困境 傳統高防IP依賴預定義規則庫&#xff0c;面對SYN Flood、CC攻擊等威脅時&#xff0c;常因規則更新滯后導致誤封合法流量。例如&#xff0c;某電商平臺曾因靜態閾值過濾誤封20%的訂單接口流量&#xff0c;直接影響營收。以下代碼模擬傳統方案…

如何實現高性能超低延遲的RTSP或RTMP播放器

隨著直播行業的快速發展&#xff0c;RTSP和RTMP協議成為了廣泛使用的流媒體傳輸協議&#xff0c;尤其是在實時視頻直播領域&#xff0c;如何構建一個高性能超低延遲的直播播放器&#xff0c;已經成為了決定直播平臺成功與否的關鍵因素之一。作為音視頻直播SDK技術老兵&#xff…

UE5 編輯器工具藍圖

文章目錄 簡述使用方法樣例自動生成Actor&#xff0c;并根據模型的包圍盒設置Actor的大小批量修改場景中Actor的屬性&#xff0c;設置Actor的名字&#xff0c;設置Actor到指定的文件夾 簡述 使用編輯器工具好處是可以在非運行時可以對資源或場景做一些操作&#xff0c;例如自動…

解鎖5月游戲新體驗 高速電腦配置推薦

很多玩家用戶會發現一個規律&#xff0c;618大促前很多商家會提前解鎖各種福利&#xff0c;5月選購各種電腦配件有時候會更劃算&#xff01;并且&#xff0c;STEAM在5月還有幾個年度主題促銷&#xff0c;“生物收集游戲節”、“僵尸大戰吸血鬼游戲節”等等&#xff0c;配件大促…

干貨|VR全景是什么?

VR全景技術解析&#xff1a;概念、特點與用途 VR全景&#xff0c;全稱為虛擬現實全景技術&#xff08;Virtual Reality Panorama Technology&#xff09;&#xff0c;是基于虛擬現實&#xff08;Virtual Reality,VR&#xff09;技術的創新展示方式。VR全景技術利用專業的拍攝設…

Nacos適配GaussDB超詳細部署流程,通過二進制包、以及 Docker 打通用鏡像包部署保姆級教程

1部署openGauss 官方文檔下載 https://support.huaweicloud.com/download_gaussdb/index.html 社區地址 安裝包下載 本文主要是以部署輕量級為主要教程,系統為openEuler,ip: 192.168.1.15 1.1系統環境準備 操作系統選擇 系統AARCH64X86-64openEuler√√CentOS7√Docker…

MySQL 表內容的增刪查改 -- CRUD操作,聚合函數,group by 子句

目錄 1. Create 1.1 語法 1.2 單行數據 全列插入 1.3 多行數據 指定列插入 1.4 插入數據否則更新數據 1.5 替換 2. Retrieve 2.1 SELECT 列 2.1.1 全列查詢 2.1.2 指定列查詢 2.1.3 查詢字段為表達式 2.1.4 為查詢結果指定別名 2.1.5 結構去重 2.2 WHERE 條件 …

LabVIEW累加器標簽通道

主要展示了 Accumulator Tag 通道的使用&#xff0c;通過三個并行運行的循環模擬不同數值的多個隨機序列&#xff0c;分別以不同頻率向累加器寫入數值&#xff0c;右側循環每秒讀取累加器值&#xff0c;同時可切換查看每秒內每次事件的平均值&#xff0c;用于演示多線程數據交互…

【iOS】源碼閱讀(五)——類類的結構分析

文章目錄 前言類的分析類的本質objc_class 、objc_object和NSObjectobjc_object&#xff1a;所有對象的基類型objc_class&#xff1a;類的底層結構NSObject&#xff1a;面向用戶的根類 小結 指針內存偏移普通指針----值拷貝對象----指針拷貝或引用拷貝用數組指針引出----內存偏…

Baklib構建企業CMS高效協作與安全管控體系

企業CMS高效協作體系構建 基于智能工作流引擎的設計邏輯&#xff0c;現代企業內容管理系統通過預設多節點審核路徑與自動化任務分配機制&#xff0c;有效串聯市場、技術、法務等跨部門協作鏈路。系統支持多人同時編輯與版本追溯功能&#xff0c;結合細粒度權限管控模塊&#x…

Linux環境變量與地址空間

哈嘍&#xff0c;各位Linux初學者們&#xff01;今天咱們來聊聊Linux中那兩個看起來很高大上但實際上跟我們日常使用息息相關的概念&#xff1a;環境變量和地址空間。別被這些術語嚇到&#xff0c;我會用最接地氣的方式給你解釋清楚&#xff01; 一、環境變量&#xff1a;Linu…

Oracle SHARED POOL的SUB POOL技術

從Oracle 9i開始&#xff0c;SHARED POOL可以分為多個SUB POOL&#xff0c;其數量受以下幾個因素影響&#xff1a; ?系統CPU的數量。默認情況下&#xff0c;在Oracle中每4個CPU分配一個SUB POOL&#xff0c;最多不能超過7個。 ?共享池的大小。SUB POOL的最小容量隨著Oracle版…