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

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

文檔講解:代碼隨想錄

題目鏈接:. - 力扣(LeetCode)

?本題其實就是盡量讓石頭分成重量相同的兩堆,相撞之后剩下的石頭最小,這樣就化解成01背包問題了

和昨天講解的416. 分割等和子集?(opens new window)非常像了。

本題物品的重量為stones[i],物品的價值也為stones[i]。

對應著01背包里的物品重量weight[i]物品價值value[i]

背包的容量為所有石塊的重量的一半

盡量湊,找到背包中能裝下的最大值,

接下來進行動規五步曲:

確定dp數組以及下標的含義

dp[j]表示容量(這里說容量更形象,其實就是重量)為j的背包,最多可以背最大重量為dp[j]

可以回憶一下01背包中,dp[j]的含義,容量為j的背包,最多可以裝的價值為 dp[j]。

相對于 01背包,本題中,石頭的重量是 stones[i],石頭的價值也是 stones[i] ,可以 “最多可以裝的價值為 dp[j]” == “最多可以背的重量為dp[j]”

?確定遞推公式

01背包的遞推公式為:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

本題則是:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);

一些同學可能看到這dp[j - stones[i]] + stones[i]中 又有- stones[i] 又有+stones[i],看著有點暈乎。

大家可以再去看 dp[j]的含義。

dp數組如何初始化

既然 dp[j]中的j表示容量,那么最大容量(重量)是多少呢,就是所有石頭的重量和。

因為提示中給出1 <= stones.length <= 30,1 <= stones[i] <= 1000,所以最大重量就是30 * 1000 。

而我們要求的target其實只是最大重量的一半,所以dp數組開到15000大小就可以了。

當然也可以把石頭遍歷一遍,計算出石頭總重量 然后除2,得到dp數組的大小。

接下來就是如何初始化dp[j]呢,因為重量都不會是負數,所以dp[j]都初始化為0就可以了,這樣在遞歸公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);中dp[j]才不會初始值所覆蓋。

遍歷順序

倒敘遍歷

最后結果推導

最后dp[target]里是容量為target的背包所能背的最大重量。

那么分成兩堆石頭,一堆石頭的總重量是dp[target],另一堆就是sum - dp[target]。

在計算target的時候,target = sum / 2 因為是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的

那么相撞之后剩下的最小石頭重量就是 (sum - dp[target]) - dp[target]。

class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:#整個石頭的重量可能不是2的倍數?,向下取整total_sum = sum(stones)target = total_sum//2dp = [0] * (target+1)for stone in stones:#注意循環的范圍for j in range(target,stone-1,-1):dp[j]  = max(dp[j],dp[j-stone]+stone)##最后的返回值為什么是這樣的return total_sum-2*dp[-1]

難點:怎么轉化為是01背包問題

補充:

  • %(取模運算符)

    • 功能:計算兩個數相除的余數。
    • 例子:7 % 3 的結果是 1,因為 7 除以 3 的余數是 1
  • /(除法運算符)

    • 功能:計算兩個數相除的商,結果是浮點數。
    • 例子:7 / 3 的結果是 2.3333333333333335,因為 7 除以 32.333...
  • //(整數除法運算符)

    • 功能:計算兩個數相除的商,結果是整數(向下取整)。
    • 例子:7 // 3 的結果是 2,因為 7 除以 32.333...,向下取整得到 2

494.目標和?

文檔講解:代碼隨想錄

題目鏈接:. - 力扣(LeetCode)

?和之前的組合總和有點像,后面對比一下

放加法的是一個集合(left),減法是一個集合(right)

left組合 - right組合 = target。

left + right = sum,而sum是固定的。right = sum - left

公式來了, left - (sum - left) = target 推導出 left = (target + sum)/2 。(如果不能整除,說明題目中沒有滿足的組合)

target是固定的,sum是固定的,left就可以求出來。

此時問題就是在集合nums中找出和為left的組合。也就是裝滿容量為left的容器有多少方法

純01背包問的是裝滿這個背包,它的最大價值是多少,分割等和子集問的是能不能裝滿這個背包,最后一塊石頭的重量是給我們一個背包,讓我們盡量去裝,而本題問的是給一個背包的容量,有多少種方法裝滿,這三道題都是01背包在不同層面上的應用

確定dp數組以及下標的含義

?dp[j]裝滿容量為j的背包有多少種方法

?確定遞推公式

有哪些來源可以推出dp[j]呢?

只要搞到nums[i],湊成dp[j]就有dp[j - nums[i]] 種方法。

例如:dp[j],j 為5,

  • 已經有一個1(nums[i]) 的話,有 dp[4]種方法 湊成 容量為5的背包。
  • 已經有一個2(nums[i]) 的話,有 dp[3]種方法 湊成 容量為5的背包。
  • 已經有一個3(nums[i]) 的話,有 dp[2]中方法 湊成 容量為5的背包
  • 已經有一個4(nums[i]) 的話,有 dp[1]中方法 湊成 容量為5的背包
  • 已經有一個5 (nums[i])的話,有 dp[0]中方法 湊成 容量為5的背包

那么湊整dp[5]有多少方法呢,也就是把 所有的 dp[j - nums[i]] 累加起來。

所以求組合類問題的公式,都是類似這種:

dp[j] += dp[j - nums[i]]

?dp數組如何初始化(不懂)

從遞推公式可以看出,在初始化的時候dp[0] 一定要初始化為1,因為dp[0]是在公式中一切遞推結果的起源,如果dp[0]是0的話,遞推結果將都是0。

這里有錄友可能認為從dp數組定義來說 dp[0] 應該是0,也有錄友認為dp[0]應該是1。

其實不要硬去解釋它的含義,咱就把 dp[0]的情況帶入本題看看應該等于多少。

如果數組[0] ,target = 0,那么 bagSize = (target + sum) / 2 = 0。 dp[0]也應該是1, 也就是說給數組里的元素 0 前面無論放加法還是減法,都是 1 種方法。

遍歷順序

01背包倒序遍歷

class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:total_sum = sum(nums)if (total_sum+target) %2 !=0 :return 0if abs(target)> total_sum:return 0left = (total_sum+target) // 2dp=[0] *(left+1) #裝滿left背包有多少方法dp[0]=1   #為什么要這樣初始化?for num in nums:for j in range(left,num-1,-1):dp[j] += dp[j-num]return dp[left]

474.一和零

?文檔講解:代碼隨想錄

題目鏈接:??????????????. - 力扣(LeetCode)

本題中strs 數組里的元素就是物品,每個物品都是一個!

而m 和 n相當于是一個背包,兩個維度的背包

m和n就是形容一種容器,裝滿這個容器最多有多少個元素就輸出多少個

理解成多重背包的同學主要是把m和n混淆為物品了,感覺這是不同數量的物品,所以以為是多重背包。

但本題其實是01背包問題!

只不過這個背包有兩個維度,一個是m 一個是n,而不同長度的字符串就是不同大小的待裝物品。

容器有兩個維度,物品也是有兩個維度,x個0,和y個1,重量就是[x,y]

確定dp數組以及下標的含義

二維dp數組

dp[m][n] :裝滿m個0,n個1最多背了多少個物品

?確定遞推公式

兩個維度,放不放當前物品(x,y)

dp[i][j] = max(dp[i][j], dp[i-x][j-y] + 1)

?dp數組如何初始化

dp[0][0] = 0

非0下標也初始為0

遍歷順序

先遍歷物品,再遍歷背包,背包倒序遍歷

class Solution:def findMaxForm(self, strs: List[str], m: int, n: int) -> int:dp = [[0 for _ in range(n+1)] for _ in range(m+1)]#遍歷物品for str in strs:x = 0y = 0for char in str:if char == '0':x+=1else:y += 1#遍歷背包for i in range(m,x-1,-1): #存放0的個數,如果寫為0,結果會不對for j in range(n,y-1,-1):#存放1的個數dp[i][j] = max(dp[i][j],dp[i-x][j-y]+1)return dp[m][n]

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

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

相關文章

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樹進行…

【喜報】科大睿智服務企業通過CMMI3級認證

?北京建投科信科技發展股份有限公司&#xff08;以下簡稱“北京建投科技” &#xff09;前身為北京銀帝科技發展公司&#xff0c;成立于1993年&#xff0c;注冊資本6,000萬元&#xff0c;為中國建銀投資有限責任公司&#xff08;簡稱“中國建投”&#xff09;的成員企業建投華…

現在,所有人都能免費用GPT-4o了!

OpenAI今日官宣&#xff0c;ChatGPT正式向所有用戶免費開放&#xff01;所有用戶均可以訪問定制化GPT、分析圖表、詢問有關照片的問題以及5月初GPT-4o添加的其他功能。 OpenAI今天在X上發布推文&#xff1a; 「所有ChatGPT免費用戶現在都可以使用瀏覽、視覺、數據分析、文件上…

element table表格行列合并span-method,根據數據動態行列合并

表格行列合并需要用到 table的方法 span-method 根據數據來進行動態的行列合并&#xff0c;實例如下&#xff1a; <el-table:data"tableData":span-method"objectSpanMethod" style"width: 100%"><el-table-columnprop"key"l…

mac電腦生成文件下載URL

1.首先打開web共享&#xff0c;終端方式。 開始 sudo apachectl start 停止&#xff1a; sudo apachectl stop 重啟&#xff1a; sudo apachectl restart 2.將需要下載的文件 app.v1.6.12_note.apk /Library/WebServer/Documents/ 目錄下 3. 同一網絡下&#xff0c;直接用…

C++系列——————類和對象(上)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、面向對象的三大特征二、類的引入2.1類的定義 三.類的訪問限定符3.1訪問限定符的介紹3.2.訪問限定符的使用 四、類的作用域五、類的實例化六、類對象模型6.1…

JavaScript的內存管理機制

No.內容鏈接1Openlayers 【入門教程】 - 【源代碼示例300】 2Leaflet 【入門教程】 - 【源代碼圖文示例 150】 3Cesium 【入門教程】 - 【源代碼圖文示例200】 4MapboxGL【入門教程】 - 【源代碼圖文示例150】 5前端就業寶典 【面試題詳細答案 1000】 文章目錄 一、內存…

Pipecat: 創建語音對話agent的開源框架,支持多模態!

項目簡介 pipecat 是用于構建語音&#xff08;和多模態&#xff09;對話代理的框架。諸如私人教練、會議助理、兒童講故事玩具、客戶支持機器人、攝入流程和尖刻的社交伙伴。 看看一些示例應用&#xff1a; 語音代理入門 您可以開始在本地計算機上運行 Pipecat&#xff0c;然…

Nginx(openresty) 開啟目錄瀏覽 以及進行美化配置

1 nginx 安裝 可以參考:Nginx(openresty) 通過lua結合Web前端 實現圖片&#xff0c;文件&#xff0c;視頻等靜態資源 訪問權限驗證&#xff0c;進行鑒權 &#xff0c;提高安全性-CSDN博客 2 開啟目錄瀏覽 location /file{alias /data/www/; #指定目錄所在路徑autoindex on; …