代碼隨想錄算法訓練營第38天 | 322. 零錢兌換 279.完全平方數 139.單詞拆分 背包問題總結

322. 零錢兌換

如果求組合數就是外層for循環遍歷物品,內層for遍歷背包。

如果求排列數就是外層for遍歷背包,內層for循環遍歷物品。

錢幣有順序和沒有順序都可以,都不影響錢幣的最小個數

視頻講解:動態規劃之完全背包,裝滿背包最少的物品件數是多少?| LeetCode:322.零錢兌換_嗶哩嗶哩_bilibili

代碼隨想錄

class Solution {public int coinChange(int[] coins, int amount) {if(amount == 0)return 0;int bagSize = amount;int[] dp = new int[amount + 1];Arrays.fill(dp,Integer.MAX_VALUE);//后面要取最小值,初始值都要設成最大dp[0] = 0;for(int i = 0;i <= bagSize;i++){for(int j = 0;j < coins.length;j++){if(i >= coins[j] && dp[i - coins[j]] != Integer.MAX_VALUE){dp[i] = Math.min(dp[i],dp[i - coins[j]] + 1);//初始值加一會越界}}}if(dp[amount] == Integer.MAX_VALUE)return -1;return dp[amount];}
}

279.完全平方數

279. 完全平方數 - 力扣(LeetCode)

視頻講解:動態規劃之完全背包,換湯不換藥!| LeetCode:279.完全平方數_嗶哩嗶哩_bilibili

代碼隨想錄

class Solution {public int numSquares(int n) {int[] dp = new int[n + 1];Arrays.fill(dp,Integer.MAX_VALUE);dp[0] = 0;dp[1] = 1;for(int i = 1;i*i <= n;i++){int s = i * i;for(int j = s;j <= n;j++){if(dp[j - s] != Integer.MAX_VALUE){dp[j] = Math.min(dp[j],dp[j - s] + 1);}}}return dp[n];}
}

139.單詞拆分

視頻講解:動態規劃之完全背包,你的背包如何裝滿?| LeetCode:139.單詞拆分_嗶哩嗶哩_bilibili

代碼隨想錄

dp[i]代表,數組元素是否能夠組成長度為i時的s

完全背包,正序遍歷

對順序有要求,先背包再物品

遞推公式:若前面的字符串可以被組合出來,同時后面的字符串也在數組元素里

int len = word.length();
? ? ? ? ? ? ? ? if(i >= len && dp[i - len] && set.contains(s.substring(i - len,i))){
? ? ? ? ? ? ? ? ? ? dp[i] = true;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }

初始化:dp[0] = true;

class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> set = new HashSet<>(wordDict);boolean[] dp = new boolean[s.length() + 1];dp[0] = true;for(int i = 1;i < s.length() + 1;i++){for(String word:set){int len = word.length();if(i >= len && dp[i - len] && set.contains(s.substring(i - len,i))){dp[i] = true;break;}}}return dp[s.length()];}
}

關于多重背包,你該了解這些!

56. 攜帶礦石資源(第八期模擬筆試)

代碼隨想錄

轉化為01背包

import java.util.*;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);int bagSize,n;bagSize = sc.nextInt();n = sc.nextInt();int[] weight = new int[n];int[] value = new int[n];int[] nums = new int[n];for(int i = 0;i < n;i++)weight[i] = sc.nextInt();for(int i = 0;i < n;i++)value[i] = sc.nextInt();for(int i = 0;i < n;i++)nums[i] = sc.nextInt();int[] dp = new int[bagSize + 1];for(int i = 0;i < n;i++){for(int j = bagSize;j >= weight[i];j--){for(int k = 1;k <= nums[i];k++){if(j >= k * weight[i])dp[j] = Math.max(dp[j],dp[j - k * weight[i]]+ k * value[i]);}}}    System.out.println(dp[bagSize]);}
}

背包問題總結

代碼隨想錄

五部曲:

  1. 確定dp數組(dp table)以及下標的含義
  2. 確定遞推公式
  3. dp數組如何初始化
  4. 確定遍歷順序
  5. 舉例推導dp數組

背包遞推公式

問能否能裝滿背包(或者最多裝多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);?

問裝滿背包有幾種方法:dp[j] += dp[j - nums[i]]?

問背包裝滿最大價值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);?

問裝滿背包所有物品的最小個數:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);?

遍歷順序

01背包

二維dp數組01背包先遍歷物品還是先遍歷背包都是可以的,且第二層for循環是從小到大遍歷。

一維dp數組01背包只能先遍歷物品再遍歷背包容量,且第二層for循環是從大到小遍歷。

完全背包

純完全背包的一維dp數組實現,先遍歷物品還是先遍歷背包都是可以的,且第二層for循環是從小到大遍歷。

但是僅僅是純完全背包的遍歷順序是這樣的,題目稍有變化,兩個for循環的先后順序就不一樣了。

如果求組合數就是外層for循環遍歷物品,內層for遍歷背包

如果求排列數就是外層for遍歷背包,內層for循環遍歷物品

如果求最小數,那么兩層for循環的先后順序就無所謂了

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

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

相關文章

關于網絡的一點知識(持續更新)

1、IP地址和子網掩碼、端口號: IP地址是設備在網絡上的地址,相當于一棟房子的門牌號。子網掩碼相當于房子所在的街道。同一條街道的房子間是通過街道直通的,主人可以互相拜訪。 舉個例子,如下圖所示。 說明:將兩臺設備的IP和子網掩碼轉化為二進制,然后將各自的IP地址和…

Idea中使用Git插件_合并當前分支到master分支_沖突解決_很簡單---Git工作筆記005

由于之前用svn習慣了,用的git少,其實在idea中使用git,解決沖突,合并分支,非常的簡單,一起來看一下吧. 一定要注意操作之前,一定要確保自己的分支代碼,都已經commit提交了,并且push到遠程了. 不要丟東西. 可以看到首先,在idea的左下角有個 git,點開以后 可以看到有顯示的分支…

[自動化] 【八爪魚】使用八爪魚實現CSDN文章自動閱讀腳本

在CSDN上&#xff0c;文章的閱讀量往往是衡量內容影響力的一個重要指標。為了測試自動化手段能否提高閱讀數&#xff0c;我嘗試使用網頁自動化工具來模擬人工閱讀某個ID的文章。 1. 網頁自動化的常見方案 談到網頁自動化&#xff0c;Selenium 是一個最常見的選擇。它可以通過…

Linux 系統性能優化高級全流程指南

Linux 系統性能優化高級全流程指南 一、系統基礎狀態捕獲 1. 系統信息建檔 除了原有的硬件、內核和存儲拓撲信息收集&#xff0c;還增加 CPU 緩存、網絡設備詳細信息等。 # 硬件信息 lscpu > /opt/tuning/lscpu.origin dmidecode -t memory > /opt/tuning/meminfo.or…

常?中間件漏洞--Tomcat

tomcat是?個開源?且免費的jsp服務器&#xff0c;默認端? : 8080&#xff0c;屬于輕量級應?服務器。它可以實現 JavaWeb程序的裝載&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系統必備的?款環境。 1.CVE-2017-12615 Tomcat put?法任意?件寫…

數據結構之棧(C語言)

數據結構之棧&#xff08;C語言&#xff09; 棧1 棧的概念與結構2 棧的初始化和銷毀2.1 棧的初始化2.2 棧的銷毀 3 入棧函數與出棧函數3.1 入棧函數3.2 出棧函數 4 取棧頂數據&#xff0c;獲取數據個數 和 判空函數4.1 取棧頂數據與獲取數據個數4.1.1 取棧頂數據4.1.2 獲取數據…

datawhale組隊學習--大語言模型—task4:Transformer架構及詳細配置

第五章 模型架構 在前述章節中已經對預訓練數據的準備流程&#xff08;第 4 章&#xff09;進行了介紹。本章主 要討論大語言模型的模型架構選擇&#xff0c;主要圍繞 Transformer 模型&#xff08;第 5.1 節&#xff09;、詳細 配置&#xff08;第 5.2 節&#xff09;、主流架…

BP神經網絡+NSGAII算法(保真)

BP神經網絡NSGAII算法 非常適合用來當作實驗驗證自己的結論&#xff0c;構建一個神經網絡模型&#xff0c;并使用NSGAII多目標優化算法來實現多領域的畢業論文的設計。僅僅使用簡單的matlab代碼就可以實現自己的多目標優化任務。 BP神經網絡算法 我的任務是預測三個變量的值…

MCU vs SoC

MCU&#xff08;Microcontroller Unit&#xff0c;單片機&#xff09;和SoC&#xff08;System on Chip&#xff0c;片上系統&#xff09;是兩種不同的芯片類型&#xff0c;盡管它們都實現了高度集成&#xff0c;但在設計目標、功能復雜性和應用場景上存在顯著差異。以下是兩者…

3.23學習總結

字符串 String java.lang,String 類代表字符串&#xff0c;Java程序中所有的字符串文字都為此類的對象 字符串的內容是不會發生改變的&#xff0c;它的對象在創建之后不能唄更改 字符串的內存模型 當使用雙引號直接賦值時&#xff0c;系統會檢查該字符串在串池中是否存在。 …

01測試分類

一、按照測試目標分類 1、界面測試 肉眼所看到的一切&#xff0c;都需要進行測試。如&#xff0c;按鈕的點擊&#xff1b;輸入框輸入文本&#xff1b;下拉框的選擇&#xff1b;其它的交互等。。。 前端開發在執行開發之前需要交互/設計的同學給出設計圖&#xff08;以圖片的…

【Git】用Git命令克隆一個遠程倉庫、修改倉庫中的文件,并將更改推送到遠程倉庫

git clone ssh://gitgithub.com:2222/Mermaid28/Groove.git # SSH地址cd rfnvtoolecho "# rfnvtool" > README.md git add README.mdgit commit -m "add README" git push -u origin master 這個一系列的 Git 命令涉及到克隆一個遠程倉庫、修改倉庫中…

關于MTU的使用(TCP/IP網絡下載慢可能與此有關)

參考鏈接&#xff1a;告訴你mtu值怎么設置才能網速最好&#xff01; -Win7系統之家 出現網絡速度被限制&#xff0c;可能與MTU值相關&#xff0c;先查看下本機的MTU winR,然后輸入&#xff1a;netsh interface ipv4 show subinterfaces &#xff0c;查看自己網絡中的MTU&…

07_GRU模型

GRU模型 雙向GRU筆記:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也稱為門控循環單元&#xff0c;是一種改進版的RNN。與LSTM一樣能夠有效捕捉長序列之間的語義關聯&#xff0c;通過引入兩個&qu…

Playwright + MCP:用AI對話重新定義瀏覽器自動化,效率提升300%!

一、引言&#xff1a;自動化測試的“瓶頸”與MCP的革新 傳統自動化測試依賴開發者手動編寫腳本&#xff0c;不僅耗時且容易因頁面動態變化失效。例如&#xff0c;一個簡單的登錄流程可能需要開發者手動定位元素、處理等待邏輯&#xff0c;甚至反復調試超時問題。而MCP&#xf…

網絡爬蟲-4:jsonpath+實戰

1.jsonpath 2.通過jsonpath實戰 一.Jasonpath核心符號 1)$: 含義&#xff1a;表示 JSON 文檔的根節點。 用法&#xff1a;所有 JSONPath 表達式都以 $ 開頭&#xff0c;表示從根節點開始查詢。 {"store": {"book": [{"title": "Book 1&…

GD32 ARM單片機開發規范檢查清單 GD32嵌入式C代碼檢查清單

GD32 ARM單片機開發規范檢查清單 以下檢查清單基于您的編程規范制定&#xff0c;可用于代碼審查和自檢過程。通過逐項檢查&#xff0c;確保代碼符合項目規范要求。 #mermaid-svg-Ye0FEIS4ZoXDXqaH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:…

求職招聘網站源碼,找工作招工系統,支持H5和各種小程序

招聘找活招工平臺系統源碼 招聘求職找工作軟件 發布信息積分充值招聘系統,里面帶纖細教程 功能介紹: 招工小程序主要針對工地招工工人找工作,工地可以發布招工信息,工人可以發布找活信息,招工信息可以置頂,置頂需要積分,積分可以通過簽到、分享邀請好友、充值獲取,后…

《Oracle DBA入門實戰:十大高頻問題詳解與避坑指南》

Oracle DBA 入門作業十問十答 本文為 Oracle DBA 入門作業整理&#xff0c;涵蓋工具使用、配置管理及權限控制等核心知識點&#xff0c;適合新手快速上手。 如有疑問或補充&#xff0c;歡迎評論區交流&#xff01; 1. DBA 常用工具有哪些&#xff1f; Oracle Universal Instal…

解決用戶同時登錄輪詢獲取用戶信息錯亂,使用WebSocket和Server-Sent Events (SSE)

為什么更推薦WebSocket Server-Sent Events (SSE) 是一種服務器向客戶端推送數據的單向通信協議&#xff0c;適合某些場景&#xff0c;在解決用戶同時登錄和實時獲取用戶信息的問題上&#xff0c;WebSocket 是更好的選擇。 1. SSE 的局限性 單向通信 SSE 是單向的&#xff0…