代碼隨想錄day36dp4

文章目錄

  • 1049.最后一塊石頭的重量II
  • 494.目標和
  • 474.一和零

1049.最后一塊石頭的重量II

題目鏈接
文章講解

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {// 1. 確定 DP 數組及下標的含義:// dp[i][j] 表示考慮前 i 塊石頭,是否能夠通過選擇一部分石頭,湊出總和為 j。// 具體地,dp[i][j] 表示使用前 i 塊石頭,是否可以組合出和為 j 的子集。// 我們的目標是計算 dp 數組,并在最后返回最后兩塊石頭的差值。int sum = 0;// 2. 計算所有元素的總和:// sum 是數組 stones 所有元素的和。我們需要判斷是否可以將數組分成兩個子集,// 每個子集的和應該是 sum / 2。for (auto stone : stones) {sum += stone;  // 累加所有石頭的重量}int ans = sum / 2;  // 目標和是 sum / 2,目的是將石頭的總和分成兩個部分,每個子集的和為 ansint m = stones.size();// 3. DP 數組如何初始化:// dp 數組是一個二維數組,dp[i][j] 表示考慮前 i 塊石頭,是否可以達到重量 j。// dp 數組的大小是 m 行,ans + 1 列,默認值初始化為 0。vector<vector<int>> dp(m, vector<int>(ans + 1, 0));// 4. 初始化 dp 數組:// 對于第 0 塊石頭,可以用它來構造和為其重量的子集。for (int i = stones[0]; i <= ans; i++) {dp[0][i] = stones[0];  // 如果重量大于等于 stones[0],則可以用第一個石頭構成和為 stones[0] 的子集}// 5. 填充 DP 數組:// 遍歷剩下的每塊石頭,更新 dp 數組。選擇是否將當前石頭添加到子集,或者跳過該石頭。for (int i = 1; i < m; i++) {  // 遍歷所有石頭for (int j = 0; j <= ans; j++) {  // 遍歷每個目標重量if (j < stones[i]) {dp[i][j] = dp[i - 1][j];  // 如果當前重量 j 小于石頭的重量,則繼承前一塊石頭的值} else {dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - stones[i]] + stones[i]);  // 否則,選擇當前石頭}}}// 6. 最終結果:// dp[m-1][ans] 表示使用所有石頭,能否湊出和為 ans 的子集。// 計算剩余的石頭差值,返回最終的差值。int x = sum - dp[m - 1][ans];  // 計算剩余部分的和return x - dp[m - 1][ans];  // 返回最后兩塊石頭的差值}
};

494.目標和

題目鏈接
文章講解

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {// 1. 確定 DP 數組及下標的含義:// dp[j] 表示是否能通過選擇一部分數,使得它們的總和為 j。// dp[bagSize] 代表是否可以通過選擇一些數的加減法得到總和為 bagSize(即 (sum + target) / 2)。int sum = 0;// 2. 計算所有元素的總和:// sum 是數組 nums 所有元素的和。我們需要將目標 target 轉換成一個可以用背包問題解決的子問題。for (auto num : nums) {sum += num;  // 累加所有元素的和}// bagSize 是我們背包的容量,其計算公式為 (sum + target) / 2。// 這是因為將一個數分為加和與減和兩部分,最終的目標是通過選取某些數使其總和為 bagSize。int bagSize = (sum + target) / 2;// 如果 (sum + target) 不是偶數,則不可能找到合適的分配方式if ((sum + target) % 2 == 1) return 0;// 如果目標的絕對值大于 sum,則不可能通過加減組合得到目標值if (abs(target) > sum) return 0;// 3. DP 數組如何初始化:// dp 數組的大小為 bagSize + 1,初始化為 0。dp[0] = 1 表示和為 0 的子集是空集,可以成立。vector<int> dp(bagSize + 1, 0);dp[0] = 1;  // 和為 0 的子集是空集// 4. 確定遞推公式:// dp[j] = dp[j] + dp[j - nums[i]]// dp[j] 表示當前和為 j 的子集數目,dp[j - nums[i]] 表示通過當前元素 nums[i] 可以組合出 j 的方式。// 我們從后向前遍歷 dp 數組,防止重復使用同一元素。for (int i = 0; i < nums.size(); i++) {  // 遍歷每個元素for (int j = bagSize; j >= nums[i]; j--) {  // 從 bagSize 向下遍歷到 nums[i]dp[j] += dp[j - nums[i]];  // 當前重量 j 可以通過加入 nums[i] 來更新子集數目}}// 5. 最終結果:// dp[bagSize] 表示能否找到若干數的加和,使得其總和為 bagSize。返回 dp[bagSize] 即可。return dp[bagSize];}
};

474.一和零

題目鏈接
文章講解
在這里插入圖片描述

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {// 1. 確定 DP 數組及下標的含義:// dp[i][j] 表示我們在使用最多 i 個 '0' 和 j 個 '1' 的情況下,能組成的最大字符串個數。// dp[m][n] 代表我們可以使用最多 m 個 '0' 和 n 個 '1' 的情況下,能夠構成的最大子集數。vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));  // 初始化 DP 數組dp[0][0] = 0;  // 初始條件:使用 0 個 '0' 和 0 個 '1' 可以組成 0 個字符串// 2. 遍歷每個字符串:// 對于每個字符串,我們計算它含有多少個 '0' 和 '1',然后更新 DP 數組。for (auto str : strs) {int x = 0, y = 0;// 3. 計算當前字符串的 '0' 和 '1' 的個數:// 遍歷當前字符串,統計其中 '0' 和 '1' 的數量。for (auto c : str) {if (c == '0') x++;  // '0' 的數量else y++;  // '1' 的數量}// 4. 更新 DP 數組:// 從后向前遍歷,避免重復使用當前字符串for (int i = m; i >= x; i--) {  // 遍歷所有可能的 '0' 數量for (int j = n; j >= y; j--) {  // 遍歷所有可能的 '1' 數量dp[i][j] = max(dp[i][j], dp[i - x][j - y] + 1);  // 當前字符串可以選擇加入,更新 dp[i][j]}}}// 5. 最終結果:// 返回 dp[m][n],即在使用最多 m 個 '0' 和 n 個 '1' 的情況下,能夠構成的最大子集數。return dp[m][n];}
};

純 0 - 1 背包 (opens new window)是求 給定背包容量 裝滿背包 的最大價值是多少。
416. 分割等和子集 (opens new window)是求 給定背包容量,能不能裝滿這個背包。
1049. 最后一塊石頭的重量 II (opens new window)是求 給定背包容量,盡可能裝,最多能裝多少
494. 目標和 (opens new window)是求 給定背包容量,裝滿背包有多少種方法。
本題是求 給定背包容量,裝滿背包最多有多少個物品。

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

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

相關文章

Python 爬蟲實戰指南:按關鍵字搜索商品

在電商領域&#xff0c;按關鍵字搜索商品并獲取其詳情信息是一項常見的需求。無論是進行市場調研、競品分析還是用戶體驗優化&#xff0c;能夠快速準確地獲取商品信息都至關重要。1688 作為國內領先的 B2B 電商平臺&#xff0c;提供了豐富的商品資源。本文將詳細介紹如何使用 P…

【源力覺醒 創作者計劃】百度AI的開放新篇章:文心4.5本地化部署指南與未來生態戰略展望

百度AI的開放新篇章&#xff1a;文心4.5本地化部署指南與未來生態戰略展望 一起來玩轉文心大模型吧&#x1f449;文心大模型免費下載地址&#xff1a;https://ai.gitcode.com/theme/1939325484087291906 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30…

測試工作中的質量門禁管理

一、前言 測試階段的質量門禁設計要考慮幾個維度,首先是研發流程的階段劃分,每個階段都要有明確的準入準出標準;其次要考慮不同測試類型的特點,比如功能測試和性能測試的驗收標準肯定不同;最后還要平衡質量要求和項目進度。 在單元測試階段,可以設置通過率和覆蓋率的閾值…

線上分享:解碼eVTOL安全基因,構建安全飛行生態

隨著城市空中交通&#xff08;UAM&#xff09;快速發展&#xff0c;電動垂直起降飛行器&#xff08;eVTOL&#xff09;面臨嚴格的安全與可靠性要求&#xff0c;需滿足全球適航標準及全生命周期分析。安全與可靠的飛行系統成為行業關注的焦點。在此背景下&#xff0c;本期線上分…

C回調函數基礎用法

&#x1f4cc; 定義&#xff1a;回調函數是通過函數指針傳遞給另一個函數的函數&#xff0c;這個被傳進去的函數將在某個時刻被“回調”調用。換句話說&#xff1a;你定義一個函數 A把函數 A 的地址&#xff08;即函數指針&#xff09;作為參數傳給函數 B函數 B 在合適的時機調…

手撕設計模式之消息推送系統——橋接模式

手撕設計模式之消息推送系統——橋接模式 1.業務需求 ? 大家好&#xff0c;我是菠菜啊&#xff0c;好久不見&#xff0c;今天給大家帶來的是——橋接模式。老規矩&#xff0c;在介紹這期內容前&#xff0c;我們先來看看這樣的需求&#xff1a;我們現在要做一個消息推送系統&…

Java 大廠面試題 -- JVM 垃圾回收機制大揭秘:從原理到實戰的全維度優化

最近佳作推薦&#xff1a; Java 大廠面試題 – JVM 面試題全解析&#xff1a;橫掃大廠面試&#xff08;New&#xff09; Java 大廠面試題 – 從菜鳥到大神&#xff1a;JVM 實戰技巧讓你收獲滿滿&#xff08;New&#xff09; Java 大廠面試題 – JVM 與云原生的完美融合&#xf…

圖機器學習(9)——圖正則化算法

圖機器學習&#xff08;9&#xff09;——圖正則化算法1. 圖正則化方法2. 流形正則化與半監督嵌入3. 神經圖學習4. Planetoid1. 圖正則化方法 淺層嵌入方法已經證明&#xff0c;通過編碼數據點間的拓撲關系可以構建更魯棒的分類器來處理半監督任務。本質上&#xff0c;網絡信息…

視頻動態范圍技術演進:從SDR到HDR的影像革命

一、動態范圍技術基礎認知 1.1 人眼視覺特性與動態范圍 人眼的動態感知范圍可達106:1&#xff08;0.0001-105 cd/m&#xff09;&#xff0c;遠超傳統顯示設備能力。視網膜通過虹膜調節&#xff08;物理孔徑&#xff09;與光化學反應&#xff08;光敏蛋白分解&#xff09;實現16…

基于LAMP環境的校園論壇項目

1.配置本地倉庫a.修改主機名為自己姓名全拼[rootserver ~]# hostnamectl set-hostname jun [rootserver ~]# bash [rootjun ~]# 運行結果圖如下圖所示&#xff1a;b.光盤掛載到/mnt目錄下[rootjun yum.repos.d]# mount /dev/sr0 /mnt mount: /mnt: WARNING: source write-prote…

在物聯網系統中時序數據庫和關系型數據庫如何使用?

在物聯網系統中&#xff0c;時序數據庫&#xff08;TSDB&#xff09;和關系型數據庫&#xff08;RDBMS&#xff09;的存儲順序設計需要根據數據特性、業務需求和系統架構綜合考慮。以下是典型的設計方案和邏輯順序&#xff1a;1. 常見存儲順序方案 方案一&#xff1a;先寫時序數…

django安裝、跨域、緩存、令牌、路由、中間件等配置

注意&#xff1a;如果是使用 PyCharm 編程工具就不用創建虛擬化&#xff0c;直接打開 PyCharm 選擇新建的目錄直接調過下面的步驟11. 項目初始化如果不是用 PyCharm 編輯器就需要手動創建虛擬環境在項目目錄cmd&#xff0c;自定義名稱的虛擬環境# 激活虛擬環境 python -m venv …

時間的弧線,邏輯的航道——標準單元延遲(cell delay)的根與源

時序弧 在這篇文章中&#xff0c;我們將討論影響標準單元延遲的因素。在開始討論之前&#xff0c;我們需要先了解一下什么是時序弧 (Timing Arcs)&#xff1a; 時序弧 (Timing Arcs)&#xff1a; 時序弧代表了信號從一個輸入流向一個輸出的方向。它存在于組合邏輯和時序邏輯中&…

《透視定軸:CSS 3D魔方中視覺層級的秩序法則》

當CSS的代碼編織出一個能自由旋轉的3D魔方&#xff0c;六個色彩各異的面在空間中翻轉、重疊時&#xff0c;最考驗技術的并非旋轉動畫的流暢度&#xff0c;而是每個面在任意角度下都能保持符合現實邏輯的前后關系。為何有時某個面會突兀地“穿透”另一個面&#xff1f;為何旋轉到…

RTL編程中常用的幾種語言對比

以下是RTL&#xff08;寄存器傳輸級&#xff09;編程中常用的幾種硬件描述語言&#xff08;HDL&#xff09;及其核心差異的對比分析。RTL編程主要用于數字電路設計&#xff0c;通過描述寄存器間的數據傳輸和邏輯操作實現硬件功能。以下內容綜合了行業主流語言的技術特性與應用場…

前端面試題(HTML、CSS、JavaScript)

目錄 一、HTML src與href區別 對html語義化理解 語義化標簽有哪些&#xff1f; script中的defer與async區別 行內元素與塊級元素有哪些&#xff1f; canvas與svg區別 SEO優化 html5新特性 二、CSS 盒模型 選擇器優先級 偽元素與偽類 隱藏元素幾種方式 水平/垂直…

Linux-線程控制

線程等待pthread_join()pthread_join 是 Linux 系統中用于線程同步的重要函數&#xff0c;主要作用是等待指定線程結束并回收其資源。基本功能- 阻塞當前調用線程&#xff0c;直到目標線程執行結束。 - 回收目標線程的資源&#xff0c;避免產生“僵尸線程”。 - 可選地獲取目標…

RAG優化秘籍:基于Tablestore的知識庫答疑系統架構設計

目錄一、技術架構設計二、雙流程圖解析橫向架構對比縱向核心流程三、企業級代碼實現Python檢索核心TypeScript前端接入YAML部署配置四、性能對比驗證五、生產級部署方案六、技術前瞻分析附錄&#xff1a;完整技術圖譜一、技術架構設計 原創架構圖 #mermaid-svg-3Ktoc4oH4xlbD6…

i.mx8 RTC問題

項目場景&#xff1a;需要增加外置RTC&#xff0c;保證時間的精準。問題描述&#xff1a;基本情況&#xff0c;外置i2c接口的RTC&#xff0c;注冊、讀寫都正常&#xff0c;但是偶發性重啟后&#xff0c;系統時間是2022&#xff0c;rtc時間是1970&#xff0c;都像是恢復了默認時…

數據集相關類代碼回顧理解 | utils.make_grid\list comprehension\np.transpose

目錄 utils.make_grid list comprehension np.transpose utils.make_grid x_gridutils.make_grid(x_grid, nrow4, padding2) make_grid 函數來自torchvision的utils模塊&#xff0c;用于圖像數據可視化&#xff0c;將一批圖像排列成一個網格。 x_grid&#xff1a;四維圖像…