●139.單詞拆分 ● 關于多重背包,你該了解這些! ●背包問題總結篇!

●139.單詞拆分?

物品:wordDict里面的單詞;背包容量:s.size()。

1.dp[j]含義。dp[j]=true表示字符串前j個可以拆分成字典中的單詞。dp[s.size()] 就是最后的結果,整個字符串能(true)不能(false)拆分成字典中的單詞。

2.遞推公式。如leetcode,依次從l、le、lee、……、leetcode這8個字符串來檢查是否能拆分成字典中的單詞,最后返回 dp[s.size()] 這是外循環。然后對于每個字符串strj的檢查,如果這個單詞中有某個位置k為true(代表0到k這個位置可以拆分)且從k+1到這個單詞的結束位置j的子串(strj字符串剩下的子串)在wordDict里面,就說明這個字符串strj從0到j都能拆分,所以dp[j]更新為true,檢查這個位置k就得從字符串strj的開始到結尾了,取不取j都可以,這就是內循環

所以這樣理解的話也確定了循環順序,外循環是背包(j從1到s.size()),內循環也是也是背包(i從0到 j-1),就跟以前做的題不太一樣。

3.初始化。dp[0]應該初始化為true,否則逐個判斷后面的元素不會得到true的值,其他的一開始就應該是false,然后后面再挨個更新,看是否換成false。

4.遍歷順序。根據之前的推理兩層循環都是背包,物品集合只是在循環里面做條件使用的。

5.打印。

代碼如下。

j=0初始為true,其他的初始為false,

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {//物品:wordDict。//背包容量:svector<bool> dp(s.size()+1,false);  dp[0]=true;unordered_set<string> wordSet(wordDict.begin(),wordDict.end());for(int j=1;j<=s.size();++j){for(int i=0;i<j;++i){string sub=s.substr(i,j-i);if(wordSet.find(sub)!=wordSet.end() && dp[i]){dp[j]=true;}}}return dp[s.size()];}
};

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

多重背包問題:有N種物品和一個容量為V 的背包。第i種物品最多有Mi件可用,每件耗費的空間是Ci ,價值是Wi 。求解將哪些物品裝入背包可使這些物品的耗費的空間 總和不超過背包容量,且價值總和最大。

每件物品的最多Mi件可用,其實可以把Mi展開,就變成了01背包問題。

所以最直接的方法就是在重量數組和價值數組里面都把這些展開了的加入進去,物品0增加為2個……但是會超時。主要消耗在vector的動態底層擴容上。

 for (int i = 0; i < n; i++) {while (nums[i] > 1) { // 物品數量不是一的,都展開weight.push_back(weight[i]);value.push_back(value[i]);nums[i]--;}}

還有方法就是不改變這兩個數組,我們知道純01背包問題可以先物品,也可以先背包,然后考慮物品i放不放入兩種情況,01背包放入就只會放入一個,所以就一個遞推語句;但是多重背包可以放1個、……nums[i]個,所以每個物品i得有nums[i]個遞推。so解決純多重背包問題,要從純01背包問題的遞推代碼:

dp[j]=max(dp[j-weight[i]]+value[i],dp[j]]

改為:

for(int k=1;k<=nums[i];++k){if(j>=k*weight[i]){dp[j]=max(dp[j-k*weight[i]]+k*value[i],dp[j]);}
}

即每個物品,都考慮不放和放k個多種情況。

代碼如下:

#include<vector>
#include<iostream>
using namespace std;
void maxValue(){int begweight,N;cin >> begweight >> N;vector<int> dp(begweight+1,0);vector<int> nums(begweight+1);vector<int> weight(N);vector<int> value(N);for (int i = 0; i < N; i++) cin >> weight[i];for (int i = 0; i < N; i++) cin >> value[i];for (int i = 0; i < N; i++) cin >> nums[i];for(int i=0;i<N;++i){//先物品for(int j=begweight;j>=weight[i];--j){for(int k=1;k<=nums[i];++k){if(j>=k*weight[i])dp[j]=max(dp[j-k*weight[i]]+k*value[i],dp[j]);}}}cout<<dp[begweight];
}int main(){maxValue();return 0;
}

注意,在隨想錄中說:多重背包在面試中基本不會出現,力扣上也沒有對應的題目,大家對多重背包的掌握程度知道它是一種01背包,并能在01背包的基礎上寫出對應代碼就可以了。

●背包問題總結篇!?

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

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

相關文章

Docker 創建容器并指定時區

目錄 1. 通過環境變量設置時區&#xff08;推薦&#xff09;2. 掛載宿主機的時區文件到容器中3. 總結 要在 Docker 容器中指定時區&#xff0c;可以通過兩種方式來實現&#xff1a; 1. 通過環境變量設置時區&#xff08;推薦&#xff09; 在 Docker 運行時&#xff0c;可以通…

NumPy數據處理詳解的筆記1

NumPy數據處理詳解的筆記1 第1章NumPy基礎 NumPy是用于處理多維數組的數值運算庫&#xff0c;不僅可用于 機器學習&#xff0c;還可以用于圖像處理&#xff0c;語言處理等任務。 1.1 NumPy的基礎與安裝方法 1.1.1 NumPy入門 NumPy是Python中進行科學計算所必備的基礎軟件庫…

CentOS安裝Docker(黑馬學習筆記)

Docker 分為 CE 和 EE 兩大版本。CE 即社區版&#xff08;免費&#xff0c;支持周期 7 個月&#xff09;&#xff0c;EE 即企業版&#xff0c;強調安全&#xff0c;付費使用&#xff0c;支持周期 24 個月。 Docker CE 分為 stable test 和 nightly 三個更新頻道。 官方網站上…

文件底層的理解之緩沖區

目錄 一、緩沖區的初步認識 二、向文件中寫數據的具體過程 三、緩沖區刷新的時機 一、緩沖區的初步認識 緩沖區其實就是一塊內存區域&#xff0c;采用空間來換時間&#xff0c;可以提高使用者的效率。我們一直說的緩沖區其實是語言層面上的緩沖區&#xff0c;其實操作系統內部…

JVM 第一部分 JVM兩種解釋器 類加載過程和類加載器

JVM是跨平臺跨語言的虛擬機&#xff0c;不直接接觸硬件&#xff0c;位于操作系統的上一層 跟字節碼文件直接關聯&#xff0c;和語言沒有關系 一次編譯成字節碼文件&#xff0c;多次執行 虛擬機可以分成三部分&#xff1a;類加載器&#xff0c;運行時數據區&#xff0c;執行引…

TDengine 在 DISTRIBUTECH 分享輸配電數據管理實踐

2 月 27-29 日&#xff0c;2024 美國國際輸配電電網及公共事業展&#xff08;DISTRIBUTECH International 2024&#xff09;在美國-佛羅里達州-奧蘭多國家會展中心舉辦。作為全球領先的年度輸配電行業盛會&#xff0c;也是美洲地區首屈一指的專業展覽會&#xff0c;該展會的舉辦…

C++從零開始的打怪升級之路(day41)

這是關于一個普通雙非本科大一學生的C的學習記錄貼 在此前&#xff0c;我學了一點點C語言還有簡單的數據結構&#xff0c;如果有小伙伴想和我一起學習的&#xff0c;可以私信我交流分享學習資料 那么開啟正題 今天分享的是關于繼承的知識點 1.派生類的默認成員函數 首先我…

【和鯨冬令營】通過數據打造爆款社交APP用戶行為分析報告

【&#x1f40b;和鯨冬令營】通過數據打造爆款社交APP用戶行為分析報告 文章目錄 【&#x1f40b;和鯨冬令營】通過數據打造爆款社交APP用戶行為分析報告1 業務背景2 數據說明3 數據探索性分析4 用戶行為分析4.1 用戶屬性與行為關系分析4.2 轉化行為在不同用戶屬性群體中的分布…

值類型和引用類型詳解(C#)

可能你對值類型和引用類型還不太了解。 值類型和引用類型&#xff0c;是c#比較基礎&#xff0c;也必須掌握的知識點&#xff0c;但是也不是那么輕易就能掌握&#xff0c;今天跟著我一起來看看吧。 典型類型 首先我們看看這兩種不同的類型有哪些比較典型的代表。 典型值類型…

【云安全】網絡安全領域安全協議

IPSEC協議 IPSec&#xff08;Internet Protocol Security&#xff09;是一種網絡層安全協議&#xff0c;用于在IP通訊過程中確保完整性、認證性和機密性。它通過在標準的IP協議上加入安全機制來實現加密和認證。IPSec主要由兩個協議組成&#xff1a;認證頭&#xff08;AH&…

在Windows 10系統中啟用快速啟動功能

在Windows 10系統中啟用快速啟動功能&#xff0c;可以按照以下步驟進行&#xff1a; 方法一&#xff08;通過設置應用&#xff09;&#xff1a; 點擊任務欄左下角的“開始”按鈕或者按鍵盤上的Win鍵打開“開始”菜單。在“開始”菜單中選擇“設置”圖標&#xff08;齒輪形狀&…

3.3日學習打卡----初學Redis(一)

3.3日學習打卡 目錄&#xff1a; 3.3日學習打卡NoSQL為什么要用NoSQL什么是NoSQL?NoSQL的四大分類關系型數據庫和非關系型數據及其區別NoSQL經典應用 RedisRedis是什么?Linux下安裝RedisDocker下安裝Redis基本知識 NoSQL 為什么要用NoSQL 單機Mysql的美好年代 在90年代&…

Sqlmap進行http頭注入及流量分析

環境準備:構建完善的安全滲透測試環境:推薦工具、資源和下載鏈接_滲透測試靶機下載-CSDN博客 利用 SQLMap 進行 HTTP 頭注入的方式對于 Less-19 注入點的注入 SQLMap 工具我使用kali中自帶的 注入準備 先使用bp將Less-19靶場的包抓下來保存到 txt 文件中,輸入賬號 admin…

Ubuntu23.10禁用Wayland

禁用前 編輯custom.conf文件 sudo vim /etc/gdm3/custom.conf 去掉WaylandEnablefalse前的#號 保存退出 重啟系統 生效: 成功轉換為X11

【LeetCode題解】2809. 使數組和小于等于 x 的最少時間+2788. 按分隔符拆分字符串+410. 分割數組的最大值

文章目錄 [2809. 使數組和小于等于 x 的最少時間](https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/)思路&#xff1a; [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)思路&#xff1a; [410. 分割數組的最大…

Leetcoder Day36| 動態規劃part03

343. 整數拆分 給定一個正整數 n&#xff0c;將其拆分為至少兩個正整數的和&#xff0c;并使這些整數的乘積最大化。 返回你可以獲得的最大乘積。 示例 1: 輸入: 2輸出: 1解釋: 2 1 1, 1 1 1。 示例 2: 輸入: 10輸出: 36解釋: 10 3 3 4, 3 3 4 36。說明: 你可以假設 …

如何提取圖片中某個位置顏色的RGB值,RGB十進制值與十六進制的轉換

打開本地的畫圖工具&#xff0c;把圖片復制或截圖粘進去&#xff0c;用顏色提取器點對應的位置就可以提取了。 獲取到的 RGB 值為 (66,133,244) 轉化后的值為 #4285F4。 【內容拓展一】&#xff1a;RGB 十進制值與十六進制的轉換 當我們從 RGB 十進制值轉換為十六進制值時&a…

Yapi部署

【GO開發工程師】Yapi部署 推薦個人主頁&#xff1a;席萬里的個人空間 文章目錄 【GO開發工程師】Yapi部署1、Yapi部署 1、Yapi部署 初始化yapi&#xff1a; git clone https://github.com/Ryan-Miao/docker-yapi.git cd docker-yapi docker-compose upyapi啟動失敗 1.cd進入…

粉絲福利-純凈Windows系統安裝鏡像下載網站

?Windows操作系統鏡像文件是從微軟或其他經過驗證的來源下載正版操作系統安裝介質的關鍵所在。以下是詳細闡述從不同渠道獲取Windows系統鏡像的說明,尤其強調官方和安全的下載途徑。Windows系統鏡像可以從多個可靠來源下載,以下是幾個推薦的選擇: 微軟官方網站 微軟官方網…

對于《幻獸帕魯》這樣的游戲,如何優化服務器性能以提高游戲體驗?

對于《幻獸帕魯》這樣的游戲&#xff0c;如何評估和優化服務器性能以提高游戲體驗&#xff1f; 硬件配置優化&#xff1a;選擇高性能的服務器&#xff0c;如4核16G的幻獸帕魯服務器&#xff0c;這樣可以保證有足夠的計算性能和內存容量來支持游戲的運行。同時&#xff0c;考慮到…