代碼隨想錄算法訓練營第四十四天 | 01背包問題 二維、 01背包問題 一維、416. 分割等和子集

01背包問題 二維

代碼隨想錄

視頻講解:帶你學透0-1背包問題!| 關于背包問題,你不清楚的地方,這里都講了!| 動態規劃經典問題 | 數據結構與算法_嗶哩嗶哩_bilibili

?1.dp數組定義

dp[i][j]? 下標為[0,i]之間的物品,任取放容量為j的背包的最大價值

2.遞推公式

不放物品i: dp[i-1][j]? 去看是否放i-1,還是有j的容量給i-1去放

放物品i : dp[i-1][j-weight[i]] + value[i],放了物品i,那么就只有j-weight[i]的容量給i-1個物品去放了,同時要加上我這個物體的價值

?dp[i][j] = max(上面兩個),取最大價值

3.數組初始化

首先看,i是由i-1推出來的,j是否左上的某一個格子或者正上推出來的(背包剩余容量)

dp[i][0] = 0,背包的容量為0,不管放哪個,價值都為0

dp[0][j] , 當背包可以裝下這個物品開始,dp[0][j]就等于這個物品的價值,裝不下就為0

4.遍歷順序

for(i<weight.size() )? ?物品

? for(j<=bagweight )? ? 背包

對于二維數組實現的01背包,物品和背包的遍歷順序是可以顛倒的,因為左上方和上方是有值的

循環體內是正序還是倒序都是可以的,因為都是根據上一行的數據來進行推導的

01背包問題 一維

代碼隨想錄

視頻講解:帶你學透01背包問題(滾動數組篇) | 從此對背包問題不再迷茫!_嗶哩嗶哩_bilibili

因為這里的i層都是由i-1層推到出來的,因此只需要一個一行的一維滾動數組來維護就可以了,不需要整個二維數組

1. dp[j] 容量為j的背包的最大價值為dp[j]

2.遞推公式

不放物品i,就是自己dp[j],也就是把上一層數據拷貝下來

放物品i , dp[j-weight[i]] + value[i]

dp[j] = max(上面兩個)

3.初始化

dp[0]=0 , 背包容量為0的時候,最大價值為0

非零下標都是初始化為0,因為為其他的話,會覆蓋掉遞推公式中算出來的值

4.遍歷順序

for(i<weight.size())? 物品

? for(j=bagweight,j>=weight[0]?)? 背包

采用倒序,是為了防止物品重復選取,比較的數據來自上一輪

正序遍歷就是用同一個物品塞滿背包,每次覆蓋的數據都是同一個物品塞滿的情況

dp【i】【j】的更新只與dp【i-1】【j】和dp【i-1】【j-weight_i】左上角這兩個數據有關,而與右邊的數據無關,那么從右向左遍歷,遍歷時左邊的數據還是上一行的數據沒有更新, 這樣子用一行數組很好的實現了我們的最終目的

在一維中,只能先遍歷物品,再遍歷背包

如果先遍歷背包,再遍歷物品,那記錄的就是只有一個物品

?

416. 分割等和子集

代碼隨想錄

視頻講解:動態規劃之背包問題,這個包能裝滿嗎?| LeetCode:416.分割等和子集_嗶哩嗶哩_bilibili

解題思路

本題元素只能使用1次,并且看能不能裝滿11這個背包

1.dp[j] 容量為j的背包的最大價值,本題最大價值和重量,都是數字本身

2. dp[j] = max(dp[j], dp[j-nums[i] + nums[i]])

3.dp[0] = 0;非零下標,初始為非負整數的最小值,也就是0,因為是由max得來的

4.遍歷順序,先遍歷物品,再遍歷背包,背包是倒序,j要大于等于nums[i],且每個物品只能使用一次

最后去判斷背包是否裝滿了 dp[target] == target

class Solution {
public:bool canPartition(vector<int>& nums) {int sum =0;for(int i: nums)sum+=i;if(sum%2!=0) return false;int  target = sum/2;vector<int> dp(target+1,0);for(int i=0 ; i< nums.size(); i++)   //物品{for(int j = target; j>=nums[i] ; j--)    //背包{dp[j] = max(dp[j], dp[j- nums[i] ] + nums[i] );   //這題物品和價值是一樣的}}if(dp[target]==target) return true;else return false;}
};

收獲

今天掌握了01背包的理論基礎,本嘗試應用

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

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

相關文章

【C#】類和對象的區別

1.區別概述 結構體和類的最大區別是在存儲空間上&#xff0c;前者是值類型&#xff0c;后者是引用類型&#xff0c;它們在賦值上有很大的區別&#xff0c;在類中指向同一塊空間的兩個類的值會隨一個類的改變而改變另一個&#xff0c;請看如下代碼所示&#xff1a; namespace …

【漯河市人才交流中心_登錄安全分析報告-Ajax泄漏滑動距離導致安全隱患】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

JavaSE:異常

1、什么是異常 在生活當中&#xff0c;不管是人還是動物又或是植物&#xff0c;都會生病&#xff1b;在程序中也是&#xff0c;作為程序猿&#xff0c;雖然我們會盡力將程序寫的完美&#xff0c;可難免會出現一些問題~ 在程序執行過程中&#xff0c;發生的一些不正常行為&…

Windows系統安裝openvino(2024.1.0)

一、openvino下載&#xff1a; 下載地址&#xff1a;下載英特爾發行版 OpenVINO 工具套件 (intel.cn) 下載完之后將壓縮包解壓&#xff0c;然后重命名文件夾為openvino_2024.1.0。 二、環境配置 以python環境為例&#xff1a;&#xff08;建議使用moniconda虛擬環境來安裝&am…

Android 圖表開發開源庫 MPAndroidChart 使用總結

1. 引言 電視項目中需要一個折線圖表示節電數據變化情況&#xff0c;類比 H5 來說&#xff0c;Android 中也應該有比較成熟的控件&#xff0c;經過調研后&#xff0c;發現 MPAndroidChart 功能比較強大&#xff0c;網上也有人說可能是目前 Android 開發最好用的一個三方庫了&a…

【力扣】LCR 130. 衣櫥整理

一、題目描述 二、算法思路 這是?道非常典型的「搜索」類問題。 我們可以通過「深搜」或者「寬搜」&#xff0c;從 [0, 0] 點出發&#xff0c;按照題目的要求&#xff08;選擇 向右移動一格 或 向下移動一格&#xff0c;但不能移動到衣柜之外 &#xff09;一直往 [m - 1, …

詳解Spring IoCDI(二)

目錄 承接上文&#xff1a;詳解Spring IoC&DI &#xff08;一&#xff09; 1.IoC詳解 1.1方法注解Bean 1.2方法注解要配合類注解使用 1.3定義多個對象 1.4重命名Bean 1.5掃描路徑 2.DI詳解 2.1DI與IoC的關系 2.2屬性注入 2.3構造方法注入 2.4Setter注入 2.5 三…

代碼隨想錄算法訓練營第四十五天|1049.最后一塊石頭的重量II、494.目標和、 474.一和零

1049.最后一塊石頭的重量II 文檔講解&#xff1a;代碼隨想錄 題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 本題其實就是盡量讓石頭分成重量相同的兩堆&#xff0c;相撞之后剩下的石頭最小&#xff0c;這樣就化解成01背包問題了。 和昨天講解的416. 分割等和…

visual studio code 全局搜索

VScode寫代碼的時候&#xff0c;會經常性的需要進行查找代碼&#xff0c;那么怎么在Visual Studio Code中進行查找呢&#xff0c;下面就來大家vscode全局搜索的方法。 想要在vscode全局搜索進行全局搜索&#xff0c;使用快捷鍵CTRLSHIFTF即可進行搜索&#xff0c;也可以在左邊…

哪吒監控+cfcdn+ 反代grp端口

哪吒監控cfcdn 反代grp端口 背景&#xff1a; 哪吒監控&#xff1a;感覺VPS線路不穩定&#xff0c;為了打消自己潛意識&#xff0c;希望量化延遲。 cfcdn&#xff1a;隱藏真實站點&#xff0c;保障小雞隱秘安全 反代grpc端口: 反代grpc到支持https(TLS)的端口&#xff0c;這…

Tomcat啟動閃退問題及解決方法

Tomcat啟動閃退問題可能由多種原因引起&#xff0c;以下是一些常見的原因及相應的解決方法&#xff0c;按照清晰的結構進行歸納&#xff1a; 一、環境變量問題 Java環境問題&#xff1a;Tomcat依賴于Java環境&#xff0c;如果JDK未正確安裝或環境變量配置不正確&#xff0c;會…

Elasticsearch 認證模擬題 - 3

1、題目 有一索引有 3 個字段&#xff0c;請寫一個查詢去匹配這三個字段&#xff0c;并且將三個字段的評分相加作為最后的總評分 # 創建索引 PUT task {"mappings": {"properties": {"fielda":{"type": "text"},"fie…

TrueNAS開啟SSH登錄ROOT

簡介: 從 SCALE Bluefin 22.12.0 開始,為了加強安全性并遵守聯邦信息處理標準 (FIPS),root帳戶登錄已被棄用。所有 TrueNAS 用戶都應創建具有所有必需權限的本地管理員帳戶,并開始使用它來訪問 TrueNAS。當根用戶密碼被禁用時,只有管理用戶帳戶才能登錄 TrueNAS Web 界面。…

從零學算法2965

2965. 找出缺失和重復的數字 給你一個下標從 0 開始的二維整數矩陣 grid&#xff0c;大小為 n * n &#xff0c;其中的值在 [1, n2] 范圍內。除了 a 出現 兩次&#xff0c;b 缺失 之外&#xff0c;每個整數都 恰好出現一次 。 任務是找出重復的數字a 和缺失的數字 b 。 返回一個…

輪狀病毒簡介-卡梅德生物

輪狀病毒是一種非常常見的病毒&#xff0c;主要影響嬰幼兒和小孩&#xff0c;引起嚴重的胃腸炎&#xff0c;表現為嚴重腹瀉、嘔吐、發燒和脫水。這種病毒全球流行&#xff0c;是全世界五歲以下兒童因腹瀉導致死亡的主要原因之一。輪狀病毒屬于Reoviridae家族&#xff0c;具有雙…

邏輯回歸【python,機器學習,算法】

邏輯回歸是一種有監督的學習分類算法&#xff0c;用于預測目標變量的概率。目標或因變量的性質是二分法的&#xff0c;這意味著將只有兩個可能的類。主要解決二分類問題。 主要步驟有三個&#xff1a; 求線性回歸曲線。通過 sigmoid 函數將線性回歸曲線轉為 0-1 范圍函數。 …

機器學習-11-使用kaggle命令下載數據集和操作指南

參考kaggle API 命令下載數據集 參考Kaggle操作完整指南(2023版) 參考Kaggle如何入門? 1 kaggle操作指南 Kaggle 是一個流行的數據科學競賽平臺。由 Goldbloom 和 Ben Hamner 創建于 2010 年。為什么這兩個家伙要創立這樣一個平臺呢? 數據科學社區一直有這樣一個難題:對…

低代碼開發平臺(Low-code Development Platform)的模塊組成部分

低代碼開發平臺&#xff08;Low-code Development Platform&#xff09;的模塊組成部分主要包括以下幾個方面&#xff1a; 低代碼開發平臺的模塊組成部分可以按照包含系統、模塊、菜單組織操作行為等維度進行詳細闡述。以下是從這些方面對平臺模塊組成部分的說明&#xff1a; …

docker安裝mysql8和mysql5.7

1.docker安裝mysql5.7,請點擊此鏈接 2.docker安裝mysql8并掛載數據卷 docker pull mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -v /mqq/mysql8/datadir:/var/lib/mysql -d…

虛擬dom的理解

由普通的js對象來描述dom對象&#xff0c;是對于真實dom的映射&#xff0c;因為不是真實的dom對象所以叫虛擬dom。因為js處理數據的速度比操作dom的速度更快&#xff0c;性能更好&#xff0c;所以讓現代這些react vue 等框架都采用了虛擬dom。 key值是唯一性的,在虛擬dom樹進行…