動態規劃背包問題

前言

動態規劃背包問題是一類經典的優化問題,涉及到選擇物品以最大化某個目標值(通常是價值或利潤),同時受到某種約束(如重量、體積或時間)。背包問題可以分為多種類型,例如0-1背包問題、完全背包問題、多重背包問題等。在0-1背包問題中,每種物品只有一個,可以選擇放或不放;在完全背包問題中,每種物品有無限個,可以選擇放任意個;在多重背包問題中,每種物品有有限個,可以選擇放任意個但不能超過給定的數量。

?解決背包問題的關鍵是定義狀態并寫出狀態轉移方程。通常,我們會定義一個二維數組dp,其中dp[i][j]表示在前i個物品中選擇一些物品放入容量為j的背包中所能獲得的最大價值。然后,我們可以通過狀態轉移方程來逐步計算dp數組的值。

01背包:

01背包問題是背包問題中的一種基礎且常見的類型。在這個問題中,每種物品都只有一件,可以選擇放入背包或者不放入背包。01背包問題的目標是選擇一些物品放入背包,使得背包中物品的總價值最大,同時不超過背包的容量限制

關鍵點

  1. 物品數量限制:每種物品只有一個,不能重復選擇。
  2. 價值最大化:目標是最大化背包中物品的總價值。
  3. 容量限制:背包有一個固定的容量,選擇的物品總體積不能超過這個容量。

動態規劃解法

對于01背包問題,可以使用動態規劃來求解。動態規劃的核心是定義狀態和寫出狀態轉移方程。

二維數組:
  1. 定義狀態:定義dp[i][j]為考慮前i個物品,在容量為j的背包中能夠獲得的最大價值。
  2. 狀態轉移方程:對于第i個物品,有兩種選擇:放入背包或不放入背包。如果放入背包,則背包的剩余容量為j - weight[i],此時的最大價值為dp[i-1][j-weight[i]] + value[i];如果不放入背包,則最大價值為dp[i-1][j]。因此,狀態轉移方程為:

? ?dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])

  1. 初始化:通常將dp[0][j]初始化為0,表示不放入任何物品時的最大價值為0。同時,dp[i][0]也應初始化為0,表示背包容量為0時的最大價值為0。
  2. 求解:按照狀態轉移方程逐步計算dp數組的值,最終dp[n][W]即為所求的最大價值,其中n是物品的數量,W是背包的容量。
一維數組:

在01背包問題中,由于每種物品只有一個,我們不需要考慮重復選擇同一物品的情況。這使得我們可以使用一維數組來減少空間復雜度,而不是傳統的二維數組。

  1. 定義狀態
    • 使用一維數組dp,其中dp[j]表示在容量為j的背包中能夠獲得的最大價值。
  2. 狀態轉移方程
    • 對于每個物品i,我們只需要考慮是否將其放入背包。如果放入,則背包的剩余容量為j - weights[i],此時的最大價值為dp[j - weights[i]] + values[i]
    • 因此,狀態轉移方程為:dp[j] = max(dp[j], dp[j - weights[i]] + values[i])
  3. 初始化
    • dp[0]應該初始化為0,因為當背包容量為0時,無法放入任何物品,所以最大價值為0。
    • 對于j > 0dp[j]的初始值依賴于問題的定義。在標準的01背包問題中,通常可以初始化為一個較小的負數,因為不放入任何物品時的價值應該是0。
  4. 遍歷順序
    • 外層循環遍歷物品,內層循環遍歷背包容量。對于每個物品,從背包容量W開始向前遍歷到該物品的重量weights[i],確保每個物品只被考慮一次。
  5. 求解
    • 在完成所有狀態轉移后,dp[W]將包含最大價值,其中W是背包的總容量。
  6. 空間復雜度
    • 使用一維數組實現,空間復雜度為O(W),其中W是背包的容量,與物品的數量n無關。
  7. 注意事項
    • 確保在遍歷背包容量時從大到小進行,以避免重復計算同一個物品的價值。
    • 這種實現方式利用了01背包問題的特性,即每種物品只有一個,不允許重復選擇。

總的來說,一維數組實現01背包問題通過巧妙地利用狀態轉移方程和遍歷順序,減少了空間復雜度,同時保持了時間復雜度為O(nW),其中n是物品的數量,W是背包的容量。

優化

在實際應用中,01背包問題可以通過一些優化手段來減少空間復雜度。例如,可以使用滾動數組來只保存當前狀態和前一個狀態的信息,從而將空間復雜度從O(nW)降低到O(W)。此外,還可以通過一些數學性質來進一步優化算法。

完全背包:

完全背包問題是背包問題的一種變體,它與01背包問題的主要區別在于每種物品有無限個,即可以選擇放入背包0個、1個、2個...等任意個。完全背包問題的目標同樣是選擇一些物品放入背包,使得背包中物品的總價值最大,同時不超過背包的容量限制。

關鍵點

  1. 物品數量無限制:每種物品有無限個,可以重復選擇。
  2. 價值最大化:目標是最大化背包中物品的總價值。
  3. 容量限制:背包有一個固定的容量,選擇的物品總體積不能超過這個容量。

動態規劃解法

對于完全背包問題,也可以使用動態規劃來求解。與01背包問題相比,完全背包問題的狀態轉移方程稍有不同。

二維數組:
  1. 定義狀態:同樣定義dp[i][j]為考慮前i個物品,在容量為j的背包中能夠獲得的最大價值。
  2. 狀態轉移方程:對于第i個物品,由于數量無限制,可以選擇放入0個、1個、2個...等任意個。因此,對于每種可能的數量k(0 ≤ k ≤ j / weight[i]),可以選擇放入k個第i個物品,此時背包的剩余容量為j - k * weight[i],最大價值為dp[i-1][j-k*weight[i]] + k*value[i]。取所有可能的k中的最大值作為dp[i][j]的值。即:dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i], dp[i-1][j-2*weight[i]] + 2*value[i], ..., dp[i-1][j-k*weight[i]] + k*value[i])。在實際實現中,可以通過循環來遍歷所有可能的k值。
  3. 初始化:與01背包問題相同,將dp[0][j]初始化為0,表示不放入任何物品時的最大價值為0。同時,dp[i][0]也應初始化為0,表示背包容量為0時的最大價值為0。
  4. 求解:按照狀態轉移方程逐步計算dp數組的值,最終dp[n][W]即為所求的最大價值,其中n是物品的數量,W是背包的容量。
一維數組:
  1. 定義:一個一維數組dp,其中dp[j]表示在容量為j的背包中能夠獲得的最大價值。
  2. 狀態轉移方程如下:dp[j] = max(dp[j], dp[j-weight[i]] + value[i])
  3. 這個方程的含義是,對于每個物品i,我們考慮放入0個、1個、2個...等任意個,直到背包容量不足以容納更多的該物品。對于每個可能的數量k(0 ≤ k ≤ j / weight[i]),我們計算放入k個物品i后的總價值,并更新dp[j]為所有可能情況中的最大值。
  4. 最終,dp[W]就是所求的最大價值,其中W是背包的容量。

需要注意的是,這里并沒有直接計算背包的體積,因為背包的體積是固定的,我們關注的是如何在不超過這個體積限制的情況下最大化價值。物品的體積是用來判斷是否可以將物品放入背包的約束條件。

優化

對于完全背包問題,一種常見的優化方法是使用一維數組來減少空間復雜度。由于每種物品可以無限次選擇,因此在遍歷物品時,可以從大到小遍歷,保證每個物品只被添加一次。這樣可以將空間復雜度從O(nW)降低到O(W)。此外,還可以利用一些數學性質來進一步優化算法,例如利用物品的單調性來減少不必要的計算。總之,完全背包問題是背包問題的一種變體,其特點在于每種物品有無限個。通過動態規劃的方法可以有效地求解完全背包問題,并根據具體問題的特點進行相應的優化。

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

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

相關文章

第三百六十回

文章目錄 1. 概念介紹2. 實現方法2.1 環繞效果2.2 立體效果 3. 示例代碼4. 內容總結 我們在上一章回中介紹了"自定義SlideImageSwitch組件"相關的內容,本章回中將介紹兩種陰影效果.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在本…

設計模式-創建型模式-原型模式

原型模式(Prototype Pattern):使用原型實例指定創建對象的種類,并且通過克隆這些原型創建新的對象。原型模式是一種對象創建型模式。原型模式其實就是從一個對象再創建另外一個可定制的對象,而且不需知道任何創建的細節…

微信小程序開發學習筆記——2.8媒體組件image的src三種引入方式

>>跟著b站up主“咸蝦米_”學習微信小程序開發中,把學習記錄存到這方便后續查找。 課程連接: https://www.bilibili.com/video/BV19G4y1K74d?p11 image:https://developers.weixin.qq.com/miniprogram/dev/component/image.html 一…

如何在Python中執行Shell腳本?

Python執行Shell命令 1、背景概述2、Python集成Shell及數據交互 1、背景概述 Python作為一種強大的腳本語言,其易用性和靈活性使得它成為自動化任務的理想選擇。在Python中執行Shell腳本可以實現一些操作系統級的功能,使程序更加靈活、易理解和易維護 在…

Redis-內存管理

Redis是基于內存存儲的,非關系型,鍵值對數據庫。因此,對Redis來說,內存空間的管理至關重要。那Redis是如何內存管理的呢? 一、最大內存限制 Redis 提供了 maxmemory 參數允許用戶設置 Redis 可以使用的最大內存大小。…

js設計模式:依賴注入模式

作用: 在對象外部完成兩個對象的注入綁定等操作 這樣可以將代碼解耦,方便維護和擴展 vue中使用use注冊其他插件就是在外部創建依賴關系的 示例: class App{constructor(appName,appFun){this.appName appNamethis.appFun appFun}}class Phone{constructor(app) {this.nam…

Elastic Search:構建語義搜索體驗

當你逐步熟悉 Elastic 時,你將使用 Elasticsearch Relevance Engine? (ESRE),該引擎旨在為 AI 搜索應用程序提供支持。 借助 ESRE,你可以利用一套開發人員工具,包括 Elastic 的文本搜索、向量數據庫和我們用于語義搜索的專有轉換…

ngnix網站服務詳解

一 Nginx的簡介 1 Nginx: ①Nginx 是開源、高性能、高可靠的 Web 和反向代理服務器,而且支持熱部署,幾乎可以做到 7 * 24 小時不間斷運行,即使運行幾個月也不需要重新啟動,還能在不間斷服務的情況下對軟件版本進行熱…

2月22日作業,按鍵中斷LED燈控制

1.使用GPIO子系統&#xff0c;編寫LED驅動&#xff0c;應用程序測試 mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/of.h> …

微軟Azure OpenAI的 GPT 接口使用小結

直接使用OpenAI的 GPT服務&#xff0c;在國內環境使用上會一些相關問題&#xff0c;微軟提供了OpenAI的服務&#xff0c;基本上可以滿足的相關的需要。下面提供一些簡單的使用操作&#xff0c;來讓你快速使用到 GPT 的服務。 前提&#xff1a;注冊Azure的賬戶&#xff0c;并綁…

OpenCV中的normalize函數以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具體應用介紹

在OpenCV中&#xff0c;normalize函數用于將圖像或矩陣的值規范化到一個特定的范圍內。這在圖像處理中非常有用&#xff0c;比如在調整圖像的對比度、準備數據進行機器學習處理時。規范化可以提高不同圖像之間的可比性&#xff0c;或是為了滿足特定算法對數據范圍的要求。 nor…

數的反碼和補碼表示

2.反碼 反碼的表示方法是: 正數的反碼是其本身負數的反碼是在其原碼的基礎上,符號位不變&#xff0c;其余各個位取反 [1][000000011原[000000011反[-1][10000001]原[11111110]反 3.補碼 補碼的表示方法是: 正數的補碼就是其本身 負數的補碼是在其原碼的基礎上,符號位不變,其余各…

36、IO進程線程/進程和線程之間的通信練習

一、使用有名管道完成兩個進程的相互通信(提示&#xff1a;可以使用多進程或多線程完成)。 代碼1&#xff1a;創建兩個有名管道文件 #include<myhead.h>int main(int argc, const char *argv[]) {if(mkfifo("./mingtohua",0664)-1)//創建小明向小華發信息的管…

Stable Diffusion 繪畫入門教程(webui)-ControlNet(深度Depth)

上篇文章介紹了線稿約束&#xff0c;這篇文章介紹下深度Depth 文章目錄 一、選大模型二、寫提示詞三、基礎參數設置四、啟用ControlNet 顧名思義&#xff0c;就是把原圖預處理為深度圖&#xff0c;而深度圖可以區分出圖像中各元素的遠近關系&#xff0c;那么啥事深度圖&#xf…

c/c++ | 字符串函數總結 | 為什么總喜歡糾結sizeof 和strlen 呢?

其實時間長了&#xff0c;稍微研究后&#xff0c;再來品味&#xff0c;別有一番滋味 總是看著混亂&#xff0c;但是靜下來看&#xff0c;還是能琢磨透的&#xff0c;只是看著復雜&#xff0c;本質是兩套風格&#xff0c;然后又要有交集&#xff0c;所以就看起來復雜 // 首先字符…

目標管理SMART原則

SMART原則是一種目標管理方法&#xff0c;它包括以下五個要素&#xff1a; 具體性&#xff08;Specific&#xff09;&#xff1a;目標應該是明確的&#xff0c;具體地說明要達成的行為標準。例如&#xff0c;一個目標可能描述為“減少客戶投訴率”&#xff0c;而不是“增強客戶…

本機防攻擊簡介

定義 在網絡中&#xff0c;存在著大量針對CPU&#xff08;Central Processing Unit&#xff09;的惡意攻擊報文以及需要正常上送CPU的各類報文。針對CPU的惡意攻擊報文會導致CPU長時間繁忙的處理攻擊報文&#xff0c;從而引發其他業務的中斷甚至系統的中斷&#xff1b;大量正常…

惠爾頓 網絡安全審計系統 任意文件讀取漏洞復現

0x01 產品簡介 惠爾頓網絡安全審計產品致力于滿足軍工四證、軍工保密室建設、國家涉密網絡建設的審計要求&#xff0c;規范網絡行為&#xff0c;滿足國家的規范&#xff1b;支持1-3線路的internet接入、1-3對網橋&#xff1b;含強大的上網行為管理、審計、監控模塊&#xff1b…

【2024軟件測試面試必會技能】Requests(5):Requests模塊_設置代理

設置代理 代理&#xff08;英語&#xff1a;Proxy&#xff09;&#xff0c;也稱網絡代理&#xff0c;是一種特殊的網絡服務&#xff0c;英文全稱是&#xff08;Proxy Server&#xff09;&#xff0c;其功 能就是代理網絡用戶去取得網絡信息。形象的說&#xff1a;它是網絡信息…

正向代理和反向代理釋義

代理 客戶端 代理 服務端 對客戶端而言&#xff0c;代理是服務端&#xff1b;對服務端而言&#xff0c;代理是客戶端。這個很好理解吧&#xff0c;以祖孫三代關系為例&#xff0c;爸爸在兒子面前是爸爸&#xff0c;爸爸在爺爺面前是兒子。 無論是正向代理還是反向代理&#…