LeetCode 322. 零錢兌換 LeetCode 279.完全平方數 LeetCode 139.單詞拆分 多重背包基礎 56. 攜帶礦石資源

LeetCode 322. 零錢兌換 ?

思路1: 回溯算法可以做,只要存儲數組的最小長度即可,但可能會超時。

思路2: ? 相當于是求最大價值的相反面,另外一個物品可以使用多次,因此是個完全背包。因此這是個完全背包的求最小價值類型題目。

注意:

  • 區分達到背包容量的方式 和 區分背包容量下的最大/最小價值,前者(方式)是通過累加遞推,后者(價值)是通過max和min函數來遞推。
  • 在求最大價值時候,由于每個元素是正數,因此dp數組是初始化為0。max()函數可以有效進行覆蓋。但本題是求最小價值,因此dp數組需要初始化為float('inf')即正無窮,這樣的話min()函數可以有效進行覆蓋。另外,dp[0]是特殊情況,需要根據情況進行手動修改。
class Solution(object):def coinChange(self, coins, amount):""":type coins: List[int]:type amount: int:rtype: int"""## 每種硬幣的數量是無限的, 因此是個完全背包。## 可以湊成總金額所需的 最少的硬幣個數。關鍵在于最少的遞推公式是什么. 最少的硬幣個數不就是求最大價值的相反面嗎## 求元素的數目,與價值有關,因此背包和物品的排列順序可以任意。## 1. dp數組定義。dp[j]表示總金額(背包容量)為j下的最少硬幣個數(最少物品數量)dp = [float('inf')] * (amount + 1)      ## 求最大價值的時候,這里是初始化為0## 現在是求最小價值,這里要初始化為最大值## 2. dp初始化# dp[0] = 1       ### 不取也是一種方式。但這里不是求方式,而是求個數dp[0] = 0         ### 因此amount = 0 的時候dp[0]是0個硬幣## 3. 遞推公式# dp[j] = min(dp[j], (dp[j-coins[i]] + 1)]  ## 每進行一次加法,就證明多了一個硬幣## 4. 遍歷順序。 跟組合和排列無關,因此背包和物品的排列順序可以任意。for i in range(len(coins)):for j in range(coins[i], len(dp)):dp[j] = min(dp[j], (dp[j-coins[i]] + 1) )## 5. 打印 dpif dp[amount] == float('inf'):      ## 硬幣的種類湊不到總金額return -1return dp[amount]

LeetCode 279.完全平方數?

思路:

1. 先根據輸入的數獲取一個物品數組,這個物品長度最短為 math.sqrt(target) 。當math.sqrt(target)平方根為整數時,此時表示target可以基于math.sqrt(target)的完全平方數一次得到。若不是,則需要列出小于math.sqrt(target)的所有可能整數的完全平方數,這個數組就是物品。

2. 搞定物品后其實這道題有差不多有思路了,另外的,遞推公式記得+1,因為是要求數量,沒加1的話就變成了求構成的完全平方數中的最小元素。

Code:

import math
class Solution(object):def numSquares(self, n):""":type n: int:rtype: int"""### 最少數量即最小價值,物品背包遍歷先后順序不影響### 由于第一個物品可以被用多次,因此是完全背包類型### 物品是一個正整數組 [1,2,3,...,n]### 將上述正整數組平方得到一個正整數組的平方數組[2,4,9,...,n^2]### 最大背包容量為nnums = [0]* (int(math.sqrt(n)))for i in range(len(nums)):nums[i] = (i+1)*(i+1)       ### 起始坐標是從0開始,要右移一位# 1. dp 定義,dp[j],整數為j下,和為j的完全平方數的最少數量dp = [float('inf')] * (n+1)# 2. dp 初始化    dp[0] = 0   ## 0 本身可以不通過別人平方相加得到# 3. 遞推公式# dp[j] = min(dp[j], dp[j-nums[i]])# dp[j] = min(dp[j], dp[j-nums[i]]+1)   ## 衡量的是數量因此要加1,而不是上述這個,這個是求其中的一個最小元素。# 4. 遍歷順序for i in range(len(nums)):              # 先遍歷物品for j in range(nums[i], len(dp)):   # 再遍歷背包dp[j] = min(dp[j], dp[j-nums[i]]+1)# 5. 打印dp# print(dp)return dp[n]

LeetCode?139.單詞拆分

類似題目:

LeetCode 131: 分割回文串。 這道題是字符串拆分成回文串,而本題是判斷字典中的單詞能否組成字符串。

思路:

這道題偏難,即考究字符串的操作,又考究了雙指針,結合雙指針來設計dp數組。通過一個雙指針來遍歷指針之間的子字符串是否存在于字典中來進行判斷,并將判斷結果更新到dp數組中。如下所示:

根據字符串的關系去更新dp數組是關鍵,下標多會有點亂,要理清dp的下標含義和i,j指向字符串時又表達什么意思。遞推公式那里要搞懂。

  • 確定遞推公式

如果確定dp[j] 是true,且 [j, i] 這個區間的子串出現在字典里,那么dp[i]一定是true。(j < i )。

所以遞推公式是 if([j, i] 這個區間的子串出現在字典里 && dp[j]是true) 那么 dp[i] = true。

Code

class Solution(object):def wordBreak(self, s, wordDict):""":type s: str:type wordDict: List[str]:rtype: bool"""### 物品可以被多次使用,因此是完全背包。### 在數字數組中,求和問題可以通過相加來判斷。關鍵:但在字符串中,如何判斷字典中的單詞拼接起來能否構成該target字符串# 1. dp數組定義。dp[j]表示長度為j的字符串能否由單詞表中的單詞構成。dp = [False] * (len(s) + 1)     # 2. dp數組初始化。先默認不能由單詞表中的單詞構成。dp[0] = True            ## 第一個表示空字符串## 雖題目默認了不會有空字符串,但dp[0]需要初始化為True,如果初始化為False, 則后面無法進行遞推,所得到的都會是False# 3. 遞推公式。關鍵:遞推公式是什么?# if dp[j] == True and [j,i] in word_dict:     ## 如果字符串中的前i個已匹配,且[i,j]這個位置存在子字符串。#       dp[i] = True# 4. 遍歷順序。單詞的構成涉及到排列,因此是先遍歷背包再遍歷物品。for i in range(1, len(dp)):    ## 先遍歷背包for j in range(i):         ## 再遍歷物品, j始終都是在i的左邊,j去追趕i, j和i的這段距離內的子字符串sub_string = s[j:i]    ## j位置開始(包括j)到i(不包括i)的這段子字符串。 i-j這段區間有i-j個字符if dp[j] == True and sub_string in wordDict:dp[i] = True       ## j + i - j = i,前j個字符可行,現在從第j開始的i-j個字符可行,因此前i個字符可行# break             ## 不break也可以,break是對一些多余的循環進行剪枝# 5. 打印dp數組return dp[len(s)]

多重背包基礎

  • 01背包是一個物品只能用一次
  • 完全背包是一個物品能用無數次
  • 多重背包是一個物品能用x次

涉及多重背包的題目較少,如遇到的話,將其轉化為01背包就行。如下所示:

56. 攜帶礦石資源

思路1:

將多重背包轉換為01背包進行解決。

需要注意如何將多重轉換為01問題,另外01問題在遍歷背包時需要注意順序。

Code

bagroom, category = input().split()
bagroom, category = int(bagroom), int(category)weight = []
for x in input().split():weight.append(int(x))price = []
for x in input().split():price.append(int(x))nums = []
for x in input().split():nums.append(int(x))for i in range(len(nums)):      ### 將多重背包轉換為01背包處理, 但如果nums數目過大的話,會導致01背包中物品數組的長度很大,進而導致超時。count = nums[i]while count != 1:weight.append(weight[i])price.append(price[i])count -= 1# 1. dp定義,dp[j]表示背包容量為j下背包的最大價值
dp = [0] * (bagroom + 1)# 2. dp初始化,初始化為0
# 3. 遞推公式。dp[j] = max(dp[j], dp[j-weight[i]+price[i]])
# 4. 遍歷順序
for i in range(len(weight)):                ## 先物品再背包容量for j in range(len(dp)-1, weight[i]-1, -1): ## 01背包這里要逆序遍歷,確保每個物品只用一次dp[j] = max(dp[j], dp[j-weight[i]]+price[i])
# 5. 打印dp數組
# print(dp)
print(dp[bagroom])

思路2:

對物品的數目也進行一個循環操作,來判斷物品的數目添加多少時可以達到最大價值。其實就是多加了個循環來判斷當前物品要裝多少個,來得到最大價值。

Code:

bagroom, category = input().split()
bagroom, category = int(bagroom), int(category)weight = []
for x in input().split():weight.append(int(x))price = []
for x in input().split():price.append(int(x))nums = []
for x in input().split():nums.append(int(x))# 1. dp定義,dp[j]表示背包容量為j下背包的最大價值
dp = [0] * (bagroom + 1)# 2. dp初始化,初始化為0
# 3. 遞推公式。dp[j] = max(dp[j], dp[j-k*weight[i]+k*price[i]])
# 4. 遍歷順序
for i in range(len(weight)):                ## 先物品再背包容量for j in range(len(dp)-1, weight[i]-1, -1): ## 這里要逆序遍歷,確保每個物品只用一次for k in range(1, nums[i]+1):   ## nums[i]+1 確保最后一個數可以被遍歷到。range是左閉右開。if j < k*weight[i]:     ## 背包容量不夠,那再大的k可以不用遍歷了breakdp[j] = max(dp[j], dp[j-k*weight[i]]+ k*price[i])# 5. 打印dp數組
# print(dp)
print(dp[bagroom])

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

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

相關文章

JAVA面試寶典 -《Elasticsearch 深度調優實戰》

文章目錄一、引言&#xff1a;搜索引擎為啥越來越慢&#xff1f;1.1 典型業務場景性能瓶頸表現??&#xff1a;二、倒排索引壓縮&#xff1a;讓存儲與檢索更高效&#x1f9e0; 2.1倒排索引結構簡述&#x1f527; 2.2 壓縮算法三劍客? 調優建議三、分片策略&#xff1a;寫入性…

克魯斯焊接機器人保護氣省氣方案

在現代焊接工藝中&#xff0c;克魯斯焊接機器人扮演著至關重要的角色。隨著制造業對成本控制和可持續發展的日益重視&#xff0c;焊接過程中的保護氣省氣問題成為了焦點。WGFACS節氣裝置為克魯斯焊接機器人的保護氣省氣提供了一種創新且有效的解決方案。克魯斯焊接機器人以其高…

JavaEE——多線程中的哈希表

目錄前言1.HashTable2.ConcurrentHashMap總結前言 在使用多線程前&#xff0c;我們用HashMap類來創建哈希表&#xff0c;但這個類線程不安全&#xff0c;在這篇文章&#xff0c;我們將介紹多線程環境的哈希表&#xff0c;將會講述HashTable, HashMap, ConcurrentHashMap這三個…

MyBatis Plus SQL性能分析:從日志到優化的全流程實戰指南

引言 在Java開發的江湖里&#xff0c;MyBatis Plus&#xff08;MP&#xff09;早已是“效率利器”——它用極簡的API封裝了CRUD操作&#xff0c;讓開發者從重復的SQL編寫中解放出來。但隨著項目數據量從“萬級”躍升至“十萬級”“百萬級”&#xff0c;一個尷尬的現實逐漸浮現&…

備忘錄設計模式

備忘錄模式&#xff08;Memento Pattern&#xff09;是一種行為設計模式&#xff0c;用于捕獲對象的內部狀態并在需要時恢復該狀態&#xff0c;同時不破壞對象的封裝性。它適用于需要實現撤銷/重做、歷史記錄或狀態快照的場景。核心組件Originator&#xff08;原發器&#xff0…

【世紀龍科技】智能網聯汽車環境感知系統教學難題的創新實踐?

在職業院校智能網聯汽車專業教學中&#xff0c;環境感知系統的教學長期面臨三大核心挑戰&#xff1a;設備成本高昂導致實訓資源不足、抽象原理難以直觀呈現、傳統教學模式難以滿足產業需求。如何讓學生在有限的教學條件下&#xff0c;深入理解激光雷達、毫米波雷達等核心部件的…

ES vs Milvus vs PG vector :LLM時代的向量數據庫選型指南

互聯網時代&#xff0c;關系型數據庫為王。相應的&#xff0c;我們的檢索方式也是精確匹配查詢為主——查找特定的用戶ID、商品編號或訂單狀態。但AI時代&#xff0c;語義檢索成為常態&#xff0c;向量數據庫成為搜索推薦系統&#xff0c;大模型RAG落地&#xff0c;自動駕駛數據…

磁盤陣列技術的功能與分類

磁盤陣列技術 磁盤陣列是由多臺磁盤存儲器組成的一個快速、大容量、高可靠的外存子系統。現在常見的磁盤陣列稱為廉價冗余磁盤陣列&#xff08;Redundant Array of Independent Disk,RAID)。目前&#xff0c;常見的 RAID 如下所示。 廉價冗余磁盤陣列 RAID級別 RAID-0是一種不具…

SpringMVC核心注解:@RequestMapping詳解

概述RequestMapping是SpringMVC中最核心的注解之一&#xff0c;用于將HTTP請求映射到MVC和REST控制器的處理方法上。基本功能RequestMapping主要用于&#xff1a;映射URL到控制器類或方法定義請求方法類型&#xff08;GET、POST等&#xff09;定義請求參數、請求頭等條件使用位…

【雜談】硬件工程師怎么用好AI工具做失效分析

最近被派到國外出差了&#xff0c;工作任務比較重&#xff0c;所以更新的頻率比較低。但在出差工作的過程中&#xff0c;我發現在失效分析時&#xff0c;有相當多的時間做的是比較重復的工作。比如失效分析肯定要一些證據如圖片、視頻。當我們做多臺設備的失效分析時&#xff0…

MyBatis詳解以及在IDEA中的開發

MyBatis概述 MyBatis是一個優秀的持久層框架&#xff0c;它支持定制化SQL、存儲過程以及高級映射。MyBatis避免了幾乎所有的JDBC代碼和手動設置參數以及獲取結果集的過程。 核心特點 優勢&#xff1a; SQL語句與Java代碼分離&#xff0c;便于維護支持動態SQL&#xff0c;靈活性…

LangGraph教程6:LangGraph工作流人機交互

文章目錄 Human-in-the-loop(人機交互) interrupt Warning Human-in-the-loop(人機交互) 人機交互(或稱“在循環中”)工作流將人類輸入整合到自動化過程中,在關鍵階段允許決策、驗證或修正。這在基于 LLM 的應用中尤其有用,因為基礎模型可能會產生偶爾的不準確性。在合規、…

Linux部署Milvus數據庫及Attu UI工具完全指南

一、準備工作1.1 環境要求操作系統&#xff1a;Ubuntu 20.04/Debian 11/CentOS 7硬件配置&#xff1a;至少8GB內存&#xff0c;4核CPU&#xff0c;50GB磁盤空間網絡要求&#xff1a;可訪問互聯網&#xff08;用于拉取Docker鏡像&#xff09;1.2 安裝Docker和Docker Compose1.2.…

開疆智能Profinet轉ModbusTCP網關連接康耐視InSight相機案例

相機配置&#xff1a;硬件連接部分可以查詢我的博客&#xff1a;點擊 這里不做說明。在電子表格視圖下&#xff0c;點擊菜單 “傳感器–網絡設置”&#xff1a;選擇工業協議&#xff0c;如圖。保存作業&#xff0c;并按照提示重啟相機。3. 相機的控制/狀態字&#xff1a;上圖中…

BERT技術架構

### **一、整體定位&#xff1a;純編碼器架構**#### **核心設計思想**> **預訓練微調**&#xff1a;> 1. **預訓練**&#xff1a;在海量無標簽文本上學習通用語言規律> 2. **微調**&#xff1a;用少量標注數據適配具體任務&#xff08;如分類/問答&#xff09;> **…

Python+ArcGIS+AI蒸散發與GPP估算|Penman-Monteith模型|FLUXNET數據處理|多源產品融合|專業科研繪圖與可視化等

結合Python編程與ArcGIS工具&#xff0c;通過AI輔助方法實現蒸散發與植被總初級生產力估算。學習國際流行的Penman-Monteith模型&#xff0c;掌握數據獲取、處理、分析和可視化全流程&#xff0c;培養生態水文與雙碳領域的實踐應用能力。通過DeepSeek、豆包等AI工具輔助代碼編寫…

elasticsearch+logstash+kibana+filebeat實現niginx日志收集(未過濾日志內容)

單點部署 環境準備 基于Rocky9虛擬機&#xff0c;內存大小為4G yum -y install lrzsz useradd elkf passwd elkf#密碼隨意su - elk rz 導入包&#xff0c;筆者導使用版本為7.17.8下載地址&#xff1a;https://www.elastic.co/downloads/past-releases/ tar -xf elasticsearch-7…

hadoop 集群問題處理

1.1.JournalNode 的作用在 HDFS HA 配置中&#xff0c;為了實現兩個 NameNode 之間的狀態同步和故障自動切換&#xff0c;Hadoop 使用了一組 JournalNode 來管理共享的編輯日志。具體來說&#xff0c;JournalNode 的主要職責包括&#xff1a;共享編輯日志&#xff1a;JournalNo…

LeetCode--46.全排列

解題思路&#xff1a;1.獲取信息&#xff1a;給定一個不含重復數字的數組&#xff0c;返回所有可能的全排列&#xff0c;可以按任意順序返回提示信息&#xff1a;1 < nums.length < 6-10 < nums[i] < 102.分析題目&#xff1a;要獲取到所有可能的全排列我們每次會從…

云徙科技----一面(全棧開發)

一、公司是做什么業務的&#xff1f;二、介紹一下自己會用的&#xff0c;熟悉的技術棧&#xff1f;三、“在 Spring 應用中&#xff0c;當你發起一個 RESTful API 請求時&#xff08;例如 GET /api/users/1&#xff09;&#xff0c;計算機系統是如何知道這個請求的&#xff1f;…