【代碼隨想錄】面試常考類型之動態規劃01背包

前言

更詳細的在大佬的代碼隨想錄 (programmercarl.com)

本系列僅是簡潔版筆記,為了之后方便觀看

不同的二叉搜索樹

96. 不同的二叉搜索樹 - 力扣(LeetCode)

通過舉例子發現重疊子問題

代碼很簡單,主要是思路問題,知道二叉搜索樹的概念,并分別對左右子樹進行計算,相乘?

class Solution {
public:int numTrees(int n) {vector<int>dp(n+1);dp[0]=1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++){dp[i]+=dp[j-1]*dp[i-j];}}return dp[n];}
};

01背包

二維01背包

dp[i][j]表示 [0-i]的物品里任意取容量為j的背包的價值

  • 不放物品i:dp[i][j]=dp[i - 1][j]
  • 放物品i:dp[i][j]=dp[i - 1][j - weight[i]] + value[i]?
  • 注意:非零下標不管初始化什么值,都不影響最后結果,但是有零下表初始化需要在注意
  • dp[0][j],當 j < weight[0]的時候,放不進去,dp[0][j] = 0;當j >= weight[0]時,dp[0][j] =value[0]

  • vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));
    for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];}
  • 二維數組實現的dp01背包for循環可以顛倒

  • for(int i = 1; i < weight.size(); i++) { // 物品for(int j = 0; j <= bagweight; j++) { // 背包if (j < weight[i]) dp[i][j] = dp[i - 1][j];else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}}

一維01背包?

dp[j]容量為j的背包的價值

  • 不放物品i:dp[j]=dp[j]
  • 放物品i:dp[j]=dp[j - weight[i]] + value[i]?
  • 注意:非零下標不管初始化什么值,都不影響最后結果,但是有零下標初始化為非負數的最小值0就可以
  • vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));
    for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];}
  • 一維數組實現的dp01背包for循環不可以顛倒,背包必須倒序輸出,這樣才能符合每個背包只能使用一次

  •   vector<int> dp(N + 1, 0);for (int i = 0; i < 物品數量; ++i) {for (int j = N; j >= costs[i]; --j) {dp[j] = max(dp[j], dp[j - costs[i]] + values[i]);}}

分割等和子集?

416. 分割等和子集 - 力扣(LeetCode)

把數組分割成兩個元素和相等的子集,可以弄成01背包問題,每個數只能使用一次,觀察是否能把num/2的背包容量給填滿

注意:本題重量和價值是統一變量

dp[j] == j 時集合中的子集總和正好可以湊成總和j

class Solution {
public:bool canPartition(vector<int>& nums) {int sum=0;vector<int>dp(10001,0);for(int i=0;i<nums.size();i++){sum+=nums[i];}if(sum%2==1) return false;//說明湊不成兩個一樣的數int target=sum/2;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;return false;    }
};

最后一塊石頭的重量II

1049. 最后一塊石頭的重量 II - 力扣(LeetCode)

兩兩石頭相撞,最終取得最小差值,可以分成兩個數量之和相近的堆,來進行計算是上一題的演變,重量和價值是統一變量

target = sum / 2向下取整,所以sum - dp[target] >=dp[target],,所以最終結果就是用大的減去小的

class Solution {
public:int lastStoneWeightII(vector<int>& nums) {int sum=0;vector<int>dp(15001,0);for(int i=0;i<nums.size();i++){sum+=nums[i];}int target=sum/2;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]);} }return sum - dp[target] - dp[target];    }
};

目標和?

?494. 目標和 - 力扣(LeetCode)

一個集合分出兩個子集,加法left集合和減法right集合?

left- right = target。

left + right = sum

right = sum - left

left - (sum - left) = target

left = (target + sum)/2

targe,sum是固定的,所以就可以轉化為在集合nums中找出和為left的組合

class targetolution {
public:int findTargettargetumWays(vector<int>& nums, int target) {int sum = 0;for (int i = 0; i < nums.size(); i++) sum += nums[i];if (abs(target) > sum) return 0; if ((target + sum) % 2 == 1) return 0; int bagtargetize = (target + sum) / 2;vector<int> dp(bagtargetize + 1, 0);dp[0] = 1;for (int i = 0; i < nums.size(); i++) {for (int j = bagtargetize; j >= nums[i]; j--) {dp[j] += dp[j - nums[i]];}}return dp[bagtargetize];}
};

一和零

474. 一和零 - 力扣(LeetCode)

dp[i][j]:最多有i個0和j個1的strs的最大子集的大小為dp[i][j]

for (int i = m; i >= zeroNum; i--) { for (int j = n; j >= oneNum; j--) {dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}
}

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

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

相關文章

Windows內核函數 - 創建關閉注冊表

在驅動程序的開發中&#xff0c;經常會用到對注冊表的操作。與Win32的API不同&#xff0c;DDK提供另外一套對注冊表操作的相關函數。首先明確一下注冊表里的幾個概念&#xff0c;避免在后面混淆。 圖1 注冊表概念 有5個概念需要重申一下&#xff1a; * 注冊表項&#xff1a; 注…

008、字符串_內部編碼

字符串類型的內部編碼有3種&#xff1a; int&#xff1a;8個字節的長整型。 embstr&#xff1a;小于等于39個字節的字符串。 raw&#xff1a;大于39個字節的字符串。 Redis會根據當前值的類型和長度決定使用哪種內部編碼實現。 整數類型示例如下&#xff1a; 127.0.0.1:6379&…

使用 MyBatis-Plus 的 IService 進行模糊查詢操作

使用 MyBatis-Plus 的 IService 進行模糊查詢操作 一、前言1. 普通模糊查詢&#xff08;like&#xff09;2. 左模糊查詢&#xff08;likeLeft&#xff09;3. 右模糊查詢&#xff08;likeRight&#xff09;4. 不匹配指定字符串的模糊查詢&#xff08;notLike&#xff09; 一、前…

unity接入live2d

在bilibili上找到一個教程&#xff0c;首先注意一點&#xff0c;你直接導入那個sdk&#xff0c;并且打開示例&#xff0c;顯示的模型是有問題的&#xff0c;你需要調整模型上腳本的一個枚舉值&#xff0c;調整它的渲染順序是front z to我看教程時候&#xff0c;很多老師都沒有提…

常用匯編指令

&#xff08;arg&#xff09;argument&#xff1a;自變量&#xff0c;變元 &#xff08;reg&#xff09;register&#xff1a;寄存器 &#xff08;seg&#xff09;segment&#xff1a;段寄存器 &#xff08;mem&#xff09;memory&#xff1a;存儲器&#xff08;內存單元&am…

什么是 BIO、NIO、AIO?

BIO、NIO、AIO 都是 Java 的 IO 模型 BIO (Blocking IO) 是傳統的 IO 模型&#xff0c;它在讀寫數據時會阻塞線程&#xff0c;直到數據讀寫完成&#xff0c;適用于并發不高的場景。 NIO (Non-blocking IO) 是 Java 的新 IO 模型&#xff0c;它在讀寫數據時不會阻塞線程&#…

Flutter 中的 AnimatedPositionedDirectional 小部件:全面指南

Flutter 中的 AnimatedPositionedDirectional 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;AnimatedPositionedDirectional 是一個用于創建具有方向感知的動畫定位效果的組件。它允許開發者在動畫過程中動態地改變子組件的位置&#xff0c;并且可以指定動畫的方向&a…

Android Compose 九:interactionSource 的使用

先上官方文檔 InteractionSource InteractionSource represents a stream of Interactions corresponding to events emitted by a component. These Interactions can be used to change how components appear in different states, such as when a component is pressed or…

數據庫技術都涵蓋那些內容

數據庫技術涵蓋了關系型數據庫&#xff08;RDBMS&#xff09;、非關系型數據庫&#xff08;NoSQL&#xff09;以及數據庫管理系統&#xff08;DBMS&#xff09;的其他方面。以下是一些我熟悉的數據庫技術&#xff1a; 關系型數據庫&#xff08;RDBMS&#xff09; MySQL&#…

溫故而知新-Spring篇【面試復習】

溫故而知新-Spring篇【面試復習】 前言版權推薦溫故而知新-Spring篇IOCAOP循環依賴springboot如果要對屬性文件中的賬號密碼加密如何實現&#xff1f;SpringBoot的優點Spring Boot 的核心注解是哪個&#xff1f;它主要由哪幾個注解組成的&#xff1f; 最后 前言 2023-7-31 15:…

Java RMI

RMI - 安全篇 RMI分為三個主體部分&#xff1a; *Client-客戶端*&#xff1a;客戶端調用服務端的方法 *Server-服務端*&#xff1a;遠程調用方法對象的提供者&#xff0c;也是代碼真正執行的地方&#xff0c;執行結束會返回給客戶端一個方法執行的結果。 *Registry-注冊中心…

詞嵌入nn.embedding的解釋

一、embedding如何處理文本 在NLP任務中&#xff0c;首先要對文本進行處理&#xff0c;將文本進行編碼轉換&#xff0c;形成向量表達&#xff0c;embedding處理文本的流程如下&#xff1a; &#xff08;1&#xff09;輸入一段文本&#xff0c;中文會先分詞&#xff08;如jieb…

python雙色球選號程序的實現與解析

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、引言&#xff1a;雙色球選號游戲的魅力 二、程序設計與實現 1. 生成紅色球號碼 2. 生…

3.游戲中自定義數據類型的解讀分析

知識來源于騰訊課堂易道云 結構的解釋&#xff1a; 計算機里的所有東西都是用二進制表示的&#xff0c;二進制是數字&#xff0c;我們用的阿拉伯數字0-9這個數字是十進制&#xff0c;計算機用的是二進制只有0或1&#xff0c;然后都是一堆0或1的數字&#xff0c;游戲中怎么把這…

AD使用問題

設計流程&#xff1a; 1.先創建項目——添加原理圖&#xff0c;原理圖庫&#xff0c;PCB&#xff0c;PCB庫 2.畫原理圖庫和封裝庫 主要有三種方法&#xff1a; &#xff08;1&#xff09;手動畫庫和封裝&#xff0c;常常用于嘉立創查詢不到的器件 &#xff08;2&#xff0…

雙機多網口配置同網段地址,可以通過目的IP確定接收數據的網卡嗎?

環境 兩臺機器兩網卡同網段接入同一個二層交換機。 機器A ens38 00:0c:29:a4:8b:fb 10.0.0.11/24 ens39 00:0c:29:a4:8b:05 10.0.0.12/24 機器B ens38 00:0c:29:4f:a6:c4 10.0.0.21/24 ens39 00:0c:29:4f:a6:ce 10.0.0.22/24 初始ARP表 只有管理口接口的ARP表項&#xff0c…

浙江大學數據結構MOOC-課后習題-第十講-排序4 統計工齡

題目匯總 浙江大學數據結構MOOC-課后習題-拼題A-代碼分享-2024 題目描述 測試點 思路分析 這道題很明顯就是利用桶排序的思路 受到課程內容的影響&#xff0c;我一開始是想著建立一個鏈表數組&#xff0c;數組內每個元素下方都存放鏈表&#xff0c;最后再遍歷統計輸出。 但是&…

【華為OD機試-C卷D卷-200分】反射計數(C++/Java/Python)

【華為OD機試】-(A卷+B卷+C卷+D卷)-2024真題合集目錄 【華為OD機試】-(C卷+D卷)-2024最新真題目錄 題目描述 給定一個包含 0 和 1 的二維矩陣。 給定一個初始位置和速度,一個物體從給定的初始位置出發,在給定的速度下進行移動,遇到矩陣的邊緣則發生鏡面發射。 無論物體…

算法訓練營第四十二天 | LeetCode 42 不同路徑、LeetCode 63 不同路徑 II

LeetCode 62 不同路徑 這題首先確定下dp數組下標和含義。主要有兩種方式&#xff0c;一種是按照位置在數組中下標直接確定&#xff0c;另一種是依據遞推時邊上的位置需要再往上和往左遞推時會出界&#xff0c;將位置設為序號而非下標。這一題第二種方式會比較好一些。遞推邏輯也…

Android和flutter交互,maven庫的形式導入aar包

記錄遇到的問題&#xff0c;在網上找了很多資料&#xff0c;都是太泛泛了&#xff0c;使用后&#xff0c;還不能生效&#xff0c;缺少詳細的說明&#xff0c;或者關鍵代碼缺失&#xff0c;我遇到的問題用紅色的標注了 導入aar包有兩種模式 1.比較繁瑣的&#xff0c;手動將aar…