【算法】----多重背包問題I,II(動態規劃)

🌹作者:云小逸
📝個人主頁:云小逸的主頁
📝Github:云小逸的Github
🤟motto:要敢于一個人默默的面對自己,強大自己才是核心。不要等到什么都沒有了,才下定決心去做。種一顆樹,最好的時間是十年前,其次就是現在!學會自己和解,與過去和解,努力愛自己。==希望春天來之前,我們一起面朝大海,春暖花開!==🤟
👏專欄:C++👏 👏專欄:Java語言👏👏專欄:Linux學習👏
👏專欄:C語言初階👏👏專欄:數據結構👏👏專欄:備戰藍橋杯👏

文章目錄

  • 前言
  • 多重背包問題
    • 二維多重背包
    • 一維多重背包
    • 優化版本
  • 最后
    • ?
    • ?


前言

今天我們接著上一篇博客繼續學習背包問題:多重背包問題,這里將介紹完全背包問題的二維解法和一維解法以及優化版本,希望你可以喜歡。在這里插入圖片描述——————————————————————————————

多重背包問題

多重背包問題是背包問題的一個變種。在這個問題中,每個物品有一個重量和一個價值,且可重復選擇多次。背包有一個容量限制,問怎樣選擇物品可以使得背包中的總價值最大。

二維多重背包

對于二維多重背包問題,我們可以將其轉化為一維多重背包問題來解決。具體來說,我們可以將第 i i i 個物品拆成 s i s_i si? 個物品,每個物品的重量和價值都是原來的 w i s i \frac{w_i}{s_i} si?wi?? v i s i \frac{v_i}{s_i} si?vi??。這樣就將二維多重背包問題轉化為了一維多重背包問題。

代碼實現如下:

int dp[N];
for (int i = 1; i <= n; i++) {for (int j = m; j >= w[i]; j--) {for (int k = 1; k <= s[i] && k * w[i] <= j; k++) {dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i]);}}
}

時間復雜度為 O ( n m ∑ i = 1 s v i ) O(nm\sum\limits_{i=1}^s v_i) O(nmi=1s?vi?)

一維多重背包

對于一維多重背包問題,我們可以使用動態規劃來解決。設 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示前 i i i 個物品中,容量為 j j j 的背包所能裝下的最大價值。則有以下狀態轉移方程:

d p [ i ] [ j ] = max ? { d p [ i ? 1 ] [ j ? k ? w i ] + k ? v i } ( 0 ≤ k ≤ ? j w i ? ) dp[i][j] = \max\{dp[i-1][j-k\cdot w_i]+k\cdot v_i\} \quad (0\leq k\leq \lfloor\frac{j}{w_i}\rfloor) dp[i][j]=max{dp[i?1][j?k?wi?]+k?vi?}(0k?wi?j??)

其中 w i w_i wi? 表示第 i i i 個物品的重量, v i v_i vi? 表示第 i i i 個物品的價值。這個方程的意思是,我們可以選擇第 i i i 個物品的 k k k 個,然后再加上前 i ? 1 i-1 i?1 個物品在剩余容量 j ? k ? w i j-k\cdot w_i j?k?wi? 的情況下所能取得的最大價值。

代碼實現如下:

int dp[N];
for (int i = 1; i <= n; i++) {for (int j = m; j >= w[i]; j--) {for (int k = 1; k * w[i] <= j && k <= s[i]; k++) {dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i]);}}
}

時間復雜度為 O ( n m ∑ i = 1 s v i ) O(nm\sum\limits_{i=1}^s v_i) O(nmi=1s?vi?)

優化版本

以上兩種方法的時間復雜度都比較高,無法通過本題。我們需要對其進行優化。

觀察上面的狀態轉移方程,我們可以發現其中有一個 max ? \max max 函數,這個函數是比較耗時的。我們可以使用單調隊列來優化這個 max ? \max max 函數。具體來說,我們可以將 d p [ i ? 1 ] [ j ? k ? w i ] + k ? v i dp[i-1][j-k\cdot w_i]+k\cdot v_i dp[i?1][j?k?wi?]+k?vi? 放入一個單調隊列中,然后取隊首元素即可。

代碼實現如下:

int dp[N];
deque<int> q;
for (int i = 1; i <= n; i++) {for (int j = 0; j < w[i]; j++) {q.clear();for (int k = 0; k * w[i] + j <= m; k++) {int x = k * w[i] + j;if (!q.empty() && k - q.front() > s[i]) {q.pop_front();}if (!q.empty()) {dp[x] = max(dp[x], dp[x - w[i]] + k * v[i]);while (!q.empty() && dp[x - w[i]] - q.back() * v[i] >= 0) {q.pop_back();}}q.push_back(k);}}
}

時間復雜度為 O ( n m log ? s ) O(nm\log s) O(nmlogs)


最后

十分感謝你可以耐著性子把它讀完和我可以堅持寫到這里,送幾句話,對你,也對我:

1. 努力讀書,尤其是家境普通或者家境差的,去學習,你的目標就是改變自己的命運,駱家輝三代人才進白宮,英國印度裔首相蘇納克,三代人才進白金漢宮,所以有一代人必須做出付出,沒辦法,你的最大任務就是完成原始資本積累。

2.不要被別人牽著鼻子走,不要別人說什么就信什么,學會分辨是非。

3.不要隨便把情緒寫在臉上,冷靜不代表軟弱,理智不等于認慫。

4.我們不能一邊過著糟糕的生活,一邊期待好事發生在我們身上。

5.窮不沾色,富不沾賭。

?

最后如果覺得我寫的還不錯,請不要忘記點贊?,收藏?,加關注?哦(。・ω・。)

愿我們一起加油,奔向更美好的未來,愿我們從懵懵懂懂的一枚菜鳥逐漸成為大佬。加油,為自己點贊!
?

?

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

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

相關文章

LeetCode-524. 通過刪除字母匹配到字典里最長單詞

1、題目描述&#xff1a; 給你一個字符串 s 和一個字符串數組 dictionary &#xff0c;找出并返回 dictionary 中最長的字符串&#xff0c;該字符串可以通過刪除 s 中的某些字符得到。 如果答案不止一個&#xff0c;返回長度最長且字母序最小的字符串。如果答案不存在&#x…

TikTok賬戶安全指南:如何取消兩步驗證?

TikTok賬戶安全指南&#xff1a;如何取消兩步驗證&#xff1f; 在這個數字化的時代&#xff0c;保護我們的在線賬戶安全變得尤為重要。TikTok&#xff0c;作為全球流行的社交媒體平臺&#xff0c;其賬戶安全更是不容忽視。兩步驗證作為一種增強賬戶安全性的措施&#xff0c;雖…

面試題之箭頭函數和普通函數有什么區別?

箭頭函數&#xff08;Arrow Function&#xff09;和普通函數&#xff08;Regular Function&#xff09;是 JavaScript 中兩種不同的函數定義方式&#xff0c;它們在語法、上下文&#xff08;this&#xff09;、原型鏈等方面存在顯著區別。以下是它們的主要區別&#xff1a; 1. …

Llama 3.1 本地電腦部署 Linux系統 【輕松簡易】

本文分享在自己的本地電腦部署 llama3.1&#xff0c;而且輕松簡易&#xff0c;快速上手。 這里借助Ollama工具&#xff0c;在Linux系統中進行大模型部署~ Llama3.1&#xff0c;有三個版本&#xff1a;8B、70B、405B Llama 3.1 405B 是第一個公開可用的模型&#xff0c;在常識…

工業安全的智能哨兵:AI如何筑起生產線的“數字防火墻“

工業安全的智能哨兵:AI如何筑起生產線的"數字防火墻" (本文共1420字,閱讀約需4分鐘) 去年某石化廠的反應釜壓力數據出現異常波動,傳統監測系統在15分鐘后才發出警報——而AI模型在23秒前就已預警。這場未遂事故揭示了一個殘酷現實:工業安全監測正在經歷從&qu…

【Bert】自然語言(Language Model)入門之---Bert

every blog every motto: Although the world is full of suffering&#xff0c; it is full also of the overcoming of it 0. 前言 對bert進行梳理 論文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 時間&#xff1a;…

Linux中使用Docker安裝DIFY搭建本地支持庫和Agent

Dify 是一款開源的大語言模型(LLM) 應用開發平臺。它融合了后端即服務&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使開發者可以快速搭建生產級的生成式 AI 應用。即使你是非技術人員&#xff0c;也能參與到 AI 應用的定義和數據運營過程中。 然而…

開源工具推薦--思維導圖、流程圖等繪制

1. 前言 在工作中&#xff0c;經常要用到各種不同的工具&#xff0c;隨著系統的升級&#xff0c;有些工具也在不斷更新升級。這里收集整理一些好用的開源工具推薦&#xff0c;遵循以下一些基本原則&#xff1a;開源免費&#xff0c;商業工具的有效平替&#xff0c;輕量級&…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_create_pool函數

ngx_create_pool 聲明在 src\core\ngx_palloc.h 中 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); 實現在 src\core\ngx_palloc.c 中 ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) {ngx_pool_t *p;p ngx_memalign(NGX_POOL_ALIGNMENT, size, lo…

ac的dhcp池里option43配錯導致ap無法上線問題排查過程

dhcp池里ac地址配錯&#xff0c;導致ap無法上線問題排查過程 問題&#xff1a;ap手動設置ac的ip正常注冊在線&#xff0c;但dhcp獲得ip和ac地址發現無法在ac上注冊成功。 組網&#xff1a; ac旁路結構&#xff0c;路由器lan口地址172.16.1.1&#xff0c;開dhcp服務&#xff0…

IntelliJ IDEA中Maven配置全指南

一、環境準備與基礎配置 1.1 Windows 環境下載并配置 Maven 見此篇博文&#xff1a;環境配置 1.2 IDEA配置步驟 打開設置面板&#xff1a;File → Settings → Build → Build Tools → Maven 關鍵配置項&#xff1a; Maven home path E:\apache-maven-3.9.9 &#xff08;…

存儲區域網絡(SAN)管理

存儲區域網絡&#xff08;Storage Area Network&#xff0c;SAN&#xff09;采用網狀通道&#xff08;Fibre Channel &#xff0c;簡稱FC&#xff09;技術&#xff0c;通過FC交換機連接存儲陣列和服務器主機&#xff0c;建立專用于數據存儲的區域網絡。SAN提供了一種與現有LAN連…

使用vue-office報錯TypeError: ft.createElementVNode is not a function

支持多種文件(.docx、.xlsx、.xls、.pdf、.pptx)預覽的vue組件庫&#xff0c;支持vue2/3。也支持非Vue框架的預覽。 不支持.doc、.ppt&#xff08;2003年及以前的版本&#xff09; 官網&#xff1a;https://www.npmjs.com/package/vue-office/excel?activeTabreadme 官方有實…

Ubuntu部署ktransformers

準備工作 一臺服務器 CPU&#xff1a;500G GPU&#xff1a;48G&#xff08;NVIDIA4090&#xff09; 系統&#xff1a;Ubuntu20.04&#xff08;github的文檔好像用的是22.04&#xff09; 第一步&#xff1a;下載權重文件 1.下載hfd wget https://hf-mirror.com/hfd/hfd.s…

C++初階——簡單實現vector

目錄 1、前言 2、Vector.h 3、Test.cpp 1、前言 簡單實現std::vector類模板。 相較于前面的string&#xff0c;vector要注意&#xff1a; 深拷貝&#xff0c;因為vector的元素可能是類類型&#xff0c;類類型元素可以通過賦值重載&#xff0c;自己實現深拷貝。 迭代器失效…

全志A133 android10 適配SLM770A 4G模塊

一&#xff0c;模塊基本信息 1.官方介紹 SLM770A是美格智能最新推出的一款LTE Cat.4無線通訊模組&#xff0c;最大支持下行速率150Mbps及上行速率50Mbps。同時向下兼容現有的3G和2G網絡&#xff0c;以確保即使在偏遠地區也可以進行網絡通信。 SLM770A模組支持分集接收和MIMO技…

微信小程序:多菜單欄設計效果

一、實現效果 二、代碼 wxml 編輯前端界面,步驟 菜單邏輯: 逐步取出數組中的項,首先取出頂部菜單項,然后選中后取出選中的底部數據(左側菜單+右側內容),然后點擊左側菜單取出選中的左側菜單對應的右側內容 ①這里我的數據是全部封裝到一個數組對象的,首先我的循環…

C++基礎知識學習記錄—string類

string實際上是C內置的一個類&#xff0c;內部對char *進行了封裝&#xff0c;不用擔心數組越界問題&#xff0c;string類中&#xff0c;除了上課講解的函數外&#xff0c;還有很多函數可以使用&#xff0c;可以自行查閱文檔。 構造函數原型&#xff1a; string(); //創建一個…

Ollama+DeepSeek+Open-WebUi

環境準備 Docker Ollama Open-WebUi Ollama 下載地址&#xff1a;Ollama docker安裝ollama docker run -d \ -v /data/ollama/data:/root/.ollama \ -p 11434:11434 \ --name ollama ollama/ollama 下載模型 Ollama模型倉庫 # 示例&#xff1a;安裝deepseek-r1:7b doc…

設計模式--訪問者模式【行為型模式】

設計模式的分類 我們都知道有 23 種設計模式&#xff0c;這 23 種設計模式可分為如下三類&#xff1a; 創建型模式&#xff08;5 種&#xff09;&#xff1a;單例模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式。結構型模式&#xff08;7 種&#xff09;&#xff1…