【代碼隨想錄_Day29】卡碼網46. 攜帶研究材料(二維數組) 46. 攜帶研究材料(滾動數組/一維) 416 分割等和子集

Day29 OK,今日份的打卡!第二十九天

  • 以下是今日份的總結
    • 攜帶研究材料(二維數組)
    • 攜帶研究材料(滾動數組/一維)
    • 分割等和子集

以下是今日份的總結

46 攜帶研究材料(二維數組)
46 攜帶研究材料(滾動數組/一維)
416 分割等和子集

今天的題目難度不低,掌握技巧了就會很簡單,盡量還是寫一些簡潔代碼 ^?_?^

攜帶研究材料(二維數組)

思路:

1.確定dp數組以及下標的含義
------ dp[i][j] 表示從下標為[0-i]的物品里任意取,放進容量為j的背包,價值總和最大是多少。
2.確定遞推公式
------不放物品i:由dp[i - 1][j]推出,即背包容量為j,里面不放物品i的最大價值,此時dp[i][j]就是dp[i - 1][j]。(其實就是當物品i的重量大于背包j的重量時,物品i無法放進背包中,所以背包內的價值依然和前面相同。)
------放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 為背包容量為j - weight[i]的時候不放物品i的最大價值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的價值),就是背包放物品i得到的最大價值
------遞歸公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
3.dp數組如何初始化
------dp[0][j],即:i為0,存放編號0的物品的時候,各個容量的背包所能存放的最大價值。
------那么很明顯當 j < weight[0]的時候,dp[0][j] 應該是 0,因為背包容量比編號0的物品重量還小。
------當j >= weight[0]時,dp[0][j] 應該是value[0],因為背包容量放足夠放編號0物品。
------dp[i][j] 是由左上方數值推導出來了,那么 其他下標初始為什么數值都可以,因為都會被覆蓋。
------統一把dp數組統一初始為0,更方便一些。
4.確定遍歷順序
------先遍歷 物品還是先遍歷背包重量呢?
------其實都可以!! 但是先遍歷物品更好理解。
5.舉例推導dp數組
------。。。。。。

值得注意的是

背包問題里,兩個for循環的先后循序是非常有講究;
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
遞歸公式中可以看出dp[i][j]是靠dp[i-1][j]和dp[i - 1][j - weight[i]]推導出來的。

//二維dp數組實現
#include <bits/stdc++.h>
using namespace std;int n, bagweight;// bagweight代表行李箱空間
void solve() {vector<int> weight(n, 0); // 存儲每件物品所占空間vector<int> value(n, 0);  // 存儲每件物品價值for(int i = 0; i < n; ++i) {cin >> weight[i];}for(int j = 0; j < n; ++j) {cin >> value[j];}// dp數組, dp[i][j]代表行李箱空間為j的情況下,從下標為[0, i]的物品里面任意取,能達到的最大價值vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));// 初始化, 因為需要用到dp[i - 1]的值// j < weight[0]已在上方被初始化為0// j >= weight[0]的值就初始化為value[0]for (int j = weight[0]; j <= bagweight; j++) {dp[0][j] = value[0];}for(int i = 1; i < weight.size(); i++) { // 遍歷科研物品for(int j = 0; j <= bagweight; j++) { // 遍歷行李箱容量// 如果裝不下這個物品,那么就繼承dp[i - 1][j]的值if (j < weight[i]) dp[i][j] = dp[i - 1][j];// 如果能裝下,就將值更新為 不裝這個物品的最大值 和 裝這個物品的最大值 中的 最大值// 裝這個物品的最大值由容量為j - weight[i]的包任意放入序號為[0, i - 1]的最大值 + 該物品的價值構成else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}}cout << dp[weight.size() - 1][bagweight] << endl;
}int main() {while(cin >> n >> bagweight) {solve();}return 0;
}

攜帶研究材料(滾動數組/一維)

思路:

和上一題表現形式差不多
1.確定dp數組以及下標的含義
------ 在一維dp數組中,dp[j]表示:容量為j的背包,所背的物品價值可以最大為dp[j]。
_
2.確定遞推公式
------dp[j - weight[i]]表示容量為j - weight[i]的背包所背的最大價值。
------dp[j - weight[i]] + value[i] 表示 容量為 j - 物品i重量 的背包 加上 物品i的價值。(也就是容量為j的背包,放入物品i了之后的價值即:dp[j])
------dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
_
3.dp數組如何初始化
------如果題目給的價值都是正整數那么非0下標都初始化為0就可以了
------dp[0]就應該是0,因為背包容量為0所背的物品的最大價值就是0。
_
4.確定遍歷順序
------如果使用一維dp數組,物品遍歷的for循環放在外層,遍歷背包的for循環放在內層,且內層for循環倒序遍歷!
------倒序遍歷是為了保證物品i只被放入一次!
_
5.舉例推導dp數組
------一維dp,分別用物品0,物品1,物品2 來遍歷背包

值得注意的是

一維dp數組的寫法,比較直觀簡潔,而且空間復雜度還降了一個數量級!

// 一維dp數組實現
#include <iostream>
#include <vector>
using namespace std;int main() {// 讀取 M 和 Nint M, N;cin >> M >> N;vector<int> costs(M);vector<int> values(M);for (int i = 0; i < M; i++) {cin >> costs[i];}for (int j = 0; j < M; j++) {cin >> values[j];}// 創建一個動態規劃數組dp,初始值為0vector<int> dp(N + 1, 0);// 外層循環遍歷每個類型的研究材料for (int i = 0; i < M; ++i) {// 內層循環從 N 空間逐漸減少到當前研究材料所占空間for (int j = N; j >= costs[i]; --j) {// 考慮當前研究材料選擇和不選擇的情況,選擇最大值dp[j] = max(dp[j], dp[j - costs[i]] + values[i]);}}// 輸出dp[N],即在給定 N 行李空間可以攜帶的研究材料最大價值cout << dp[N] << endl;return 0;
}

分割等和子集

思路:

1.確定dp數組以及下標的含義
------ dp[j]表示 背包總容量(所能裝的總重量)是j,放進物品后,背的最大重量為dp[j]
2.確定遞推公式
------01背包的遞推公式為:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
------本題,相當于背包里放入數值,那么物品i的重量是nums[i],其價值也是nums[i]。
------所以遞推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
3.dp數組如何初始化
------從dp[j]的定義來看,首先dp[0]一定是0;
------如果題目給的價值都是正整數那么非0下標都初始化為0就可以了;
------如果題目給的價值有負數,那么非0下標就要初始化為負無窮;
------這樣才能讓dp數組在遞推的過程中取得最大的價值,而不是被初始值覆蓋了。
4.確定遍歷順序
------如果使用一維dp數組,物品遍歷的for循環放在外層,遍歷背包的for循環放在內層,且內層for循環倒序遍歷!
5.舉例推導dp數組
------dp[j]的數值一定是小于等于j的。
------如果dp[j] == j 說明,集合中的子集總和正好可以湊成總和j,理解這一點很重要。

值得注意的是

01背包相對于本題,主要要理解,題目中物品是nums[i],重量是nums[i],價值也是nums[i],背包體積是sum/2。
如果使用一維dp數組,物品遍歷的for循環放在外層,遍歷背包的for循環放在內層,且內層for循環倒序遍歷!(很重要!!!)

    bool canPartition(vector<int>& nums) {int sum = 0;// dp[i]中的i表示背包內總和// 題目中說:每個數組中的元素不會超過 100,數組的大小不會超過 200// 總和不會大于20000,背包最大只需要其中一半,所以10001大小就可以了vector<int> dp(10001, 0);for (int i = 0; i < nums.size(); i++) {sum += nums[i];}// 也可以使用庫函數一步求和// int sum = accumulate(nums.begin(), nums.end(), 0);if (sum % 2 == 1)return false;int target = sum / 2;// 開始 01背包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]);}}// 集合中的元素正好可以湊成總和targetif (dp[target] == target)return true;return false;}

寫在最后

----OK,今日份的博客就寫到這里,這一期的動態規劃好巧妙,明天繼續加油!!!
—還沒看下期的題,但是我的棧還有一節沒寫;
–追上時間進度了!!(笑
-🈚?。

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

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

相關文章

Android 性能優化之內存優化

文章目錄 Android 性能優化之內存優化內存問題內存抖動內存泄露內存溢出 檢測工具Memory ProfilerMemory AnalyzerLeakCanary 內存管理機制JavaAndroid 解決內存抖動問題模擬問題代碼使用Memory Profiler工具檢測優化技巧 內存泄露問題模擬問題代碼使用LeakCanary工具檢測優化技…

順序結構 ( 四 ) —— 標準數據類型 【互三互三】

序 C語言提供了豐富的數據類型&#xff0c;本節介紹幾種基本的數據類型&#xff1a;整型、實型、字符型。它們都是系統定義的簡單數據類型&#xff0c;稱為標準數據類型。 整型&#xff08;integer&#xff09; 在C語言中&#xff0c;整型類型標識符為int。根據整型變量的取值范…

開源大勢所趨

一、開源項目的發展趨勢 技術棧多樣化與專業化&#xff1a;隨著技術的不斷進步&#xff0c;開源項目涵蓋了從云計算、大數據、人工智能到區塊鏈、物聯網等各個領域&#xff0c;技術棧日益豐富和專業化。這種趨勢使得開發者能夠根據自己的需求選擇最適合的技術工具&#xff0c;促…

dify-api的Dockerfile分析

一.dify-api的Dockerfile文件 dify-api的Dockerfile文件如下所示&#xff1a; # base image FROM python:3.10-slim-bookworm AS baseLABEL maintainer"takatostgmail.com"# install packages FROM base as packagesRUN apt-get update \&& apt-get install…

nginx安裝配置視頻頻服務器-windows

編譯安裝nginx 1、安裝perl 安裝地址: https://strawberryperl.com&#xff0c;選擇msi安裝程序即可 2、安裝sed for windows 下載地址&#xff1a;https://sourceforge.net/projects/gnuwin32/files/sed/&#xff0c;執行安裝程序結束后&#xff0c;將安裝包bin目錄配置到…

【seo常見的問題】搜索引擎

1、讓網站訪問量提高的最好的方法是什么? 了解搜索引擎行為和搜索用戶的行為&#xff0c;就是通過觀察搜索引擎排名機制獲得有效途徑&#xff0c;提供效率&#xff0c;并且通過一些相關數據&#xff0c;了解到用戶的搜索行為。 2、我要你把一個站的關鍵詞排名排到首頁&#x…

【Adobe】動作捕獲和動畫制作軟件Character Animator

Adobe Character Animator 是一款由Adobe公司出品的動作捕獲和動畫制作軟件&#xff0c;旨在幫助用戶直觀地制作2D&#xff08;二維&#xff09;人物動畫、實時動畫&#xff0c;并發布動畫。這款軟件功能強大、操作簡單&#xff0c;非常適合動畫制作者、直播主以及社交媒體內容…

【STM32 ARM】操作寄存器控制led

文章目錄 前言GPIO操作方法led原理圖設置時鐘APB的概念 設置APB設置輸出引腳設置引腳高低電平寄存器尋找寄存器地址 總結 前言 STM32是STMicroelectronics&#xff08;意法半導體&#xff09;公司的一款32位Flash微控制器產品&#xff0c;基于ARM Cortex?-M內核。STM32系列微…

Groovy vs Kotlin 在Gradle配置文件中的差異與選擇

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

beyond Compare連接 openWrt 和 VsCode

連接步驟總結 1. 新建會話 -> 文件夾比較 2.點擊瀏覽文件夾 3.在彈出頁面 配置 ftp 3.1&#xff09;選中ftp 配置文件 3.2)選中ssh2 3.3)填寫我們需要遠端連接的主機信息 先點擊連接并瀏覽 得到下方文件夾 彈出無效登錄&#xff0c;說明需要密碼 我們返回右鍵剛剛創建的新 …

C++ | Leetcode C++題解之第227題基本計算器II

題目&#xff1a; 題解&#xff1a; class Solution { public:int calculate(string s) {vector<int> stk;char preSign ;int num 0;int n s.length();for (int i 0; i < n; i) {if (isdigit(s[i])) {num num * 10 int(s[i] - 0);}if (!isdigit(s[i]) &&am…

【智能制造-14】機器視覺軟件

CCD相機和COMS相機? CCD&#xff08;Charge-Coupled Device&#xff09;相機和CMOS&#xff08;Complementary Metal-Oxide-Semiconductor&#xff09;相機是兩種常見的數字圖像傳感器技術&#xff0c;用于捕捉和處理圖像。 CCD相機&#xff1a; CCD相機使用一種稱為CCD的光電…

北方論叢期刊

《北方論叢》投稿指南 為適應學術期刊文獻信息傳播現代化的需要&#xff0c;全面提高期刊質量&#xff0c;擴大學術交流&#xff0c;根據《中國學術期刊(光盤版)檢索與評價數據規范》《中國高等學校社會科學學報編排規范》以及其他國家標準和法規文件&#xff0c;并結合《北方論…

如何用webpack來優化前端性能?

Webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。它通過分析你的項目結構&#xff0c;找到 JavaScript 模塊以及其它的一些瀏覽器不能直接運行的拓展語言&#xff08;如SCSS, TypeScript等&#xff09;&#xff0c;并將其轉換和打包為合適的格式供瀏…

數據分析入門指南:表結構數據(三)

在數字化轉型的浪潮中&#xff0c;表結構數據作為企業決策支持系統的核心要素&#xff0c;其重要性日益凸顯。本文深入剖析了表結構數據的本質特征、高效處理策略&#xff0c;并探討了其在現代商業智能環境中的廣泛應用&#xff0c;旨在為數據分析師與決策者提供前沿洞察與實戰…

人工智能算法工程師(中級)課程3-sklearn機器學習之數據處理與代碼詳解

大家好&#xff0c;我是微學AI,今天給大家分享一下人工智能算法工程師(中級)課程3-sklearn機器學習之數據處理與代碼詳解。 Sklearn&#xff08;Scikit-learn&#xff09;是一個基于Python的開源機器學習庫&#xff0c;它提供了簡單有效的數據挖掘和數據分析工具。Sklearn包含了…

華為HCIP Datacom H12-821 卷34

1.單選題 防火墻默認已經創建了一些安全區域,以下哪一個安全區域不是防火墻上默認存在的? A、Trust B、DMZ C、Internet D、Local 正確答案&#xff1a; C 解析&#xff1a; 防火墻默認情況下為我們提供了三個安全區域&#xff0c;分別是 Trust、DMZ和Untrust 2.判斷題 …

電腦快捷鍵:提升效率的秘密武器

在現代社會中&#xff0c;電腦已經成為我們生活中不可或缺的工具。然而&#xff0c;要想充分利用電腦的功能&#xff0c;熟練掌握一些快捷鍵是必不可少的。本文將為您介紹一些常用的電腦快捷鍵&#xff0c;幫助您提高工作效率&#xff0c;節省寶貴的時間。 Windows 系統快捷鍵 …

【國產開源可視化引擎Meta2d.js】鷹眼地圖

鷹眼地圖 畫布右下角彈出一個縮略導航地圖&#xff0c;鼠標點擊可以跳到指定位置。 在線體驗&#xff1a; 樂吾樂2D可視化 示例&#xff1a; // 顯示縮略地圖 meta2d.showMap();// 關閉縮略地圖 meta2d.hideMap();

樹形結構的一種便捷實現方案

背景 在開發過程中經常需要把平鋪的數據結構轉為樹形的數據結構&#xff0c;例如多級菜單、組織機構等。 實現方案有很多種。 1、可以使用遞歸查詢&#xff0c;但是這樣數據一多會導致頻繁的多次查詢數據庫&#xff0c;產生很多額外的IO開銷&#xff0c;總體的響應時間會比較…