代碼隨想錄算法訓練營第四十二天【動態規劃part04】 | 01背包、416. 分割等和子集

01背包問題

題目鏈接:

題目頁面

求解思路:

  1. 確定dp數組及其下標含義:dp[i][j] 表示從下標為 [0] 到 [i] 的物品里任意選取,放進容量為j的背包,此時的價值總和最大值
  2. 確定遞推公式:
    不放物品i,總和為dp[i-1][j];
    放物品i,總和為 dp[i - 1][j - weight[i]] + value[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物品
  4. 確定遍歷順序:有兩個遍歷的維度,分別為物品與背包重量,本題中先遍歷哪個都可以
  5. 舉例推導dp數組:如圖所示

代碼:

#include <bits/stdc++.h>
using namespace std;int n, 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數組全部初始化為0vector<vector<int>> dp(weight.size(), vector<int>(bagweight + 1, 0));// 當只有1件物品的時候(第一行)的初始化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++){ // 遍歷背包if (j < weight[i]) // 放不下的情況dp[i][j] = dp[i-1][j];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(){cin >> n >> bagweight;solve();return 0;
}

01背包問題(滾動數組)

題目鏈接:

卡碼網KamaCoder

求解思路:

對于背包問題其實狀態都是可以壓縮的。

在使用二維數組的時候,遞推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

其實可以發現如果把dp[i - 1]那一層拷貝到dp[i]上,表達式完全可以是:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);

與其把dp[i - 1]這一層拷貝到dp[i]上,不如只用一個一維數組了,只用dp[j](一維數組,也可以理解是一個滾動數組)。

這就是滾動數組的由來,需要滿足的條件是上一層可以重復利用,直接拷貝到當前層。

動規五部曲

  1. 確定dp數組的意義:dp[j] 表示容量為j的背包,所背的物品最大價值為 dp[j]
  2. 確定遞推公式:根據上文可知,dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
  3. dp數組的初始化:因為背包容量為0所背的物品的最大價值就是0,所以dp[0] = 0;dp[j] 在計算的時候會加上自身來判斷更大的值,且所有物品價值大于0,為了讓值不被初始值覆蓋,其他下標也都初始化成0
  4. 遍歷順序:注意必須倒序遍歷,并且先遍歷物品再遍歷背包
  5. 舉例推導dp數組:如圖所示

代碼:

#include <iostream>
#include <vector>
using namespace std;int main(){int 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 i = 0; i < M; i++)cin >> values[i];vector<int> dp(N+1, 0);for (int i = 0; i < M; i++){for (int j = N; j >= costs[i]; j--){dp[j] = max(dp[j], dp[j-costs[i]] + values[i]);}}cout << dp[N] << endl;return 0;
}

416. 分割等和子集

題目鏈接:

力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

求解思路:

分割成兩個等和子集,等于找出和為一半的子集,等于一個容量為數組和一半的背包可以被數組里的數裝滿。

注意事項

  • 背包的體積為sum / 2
  • 背包要放入的商品(集合里的元素)重量為 元素的數值,價值也為元素的數值
  • 背包如果正好裝滿,說明找到了總和為 sum / 2 的子集。
  • 背包中每一個元素是不可重復放入。

動規五部曲

  1. 確定dp數組及其下標含義:dp[j] 表示背包總容量為j,放進物品后,背包的最大重量為dp[j]
  2. 確定遞推公式:因為物品i的重量和價值都是nums[i],所以 dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
  3. dp數組的初始化:dp[0] = 0,其他下標也為0(因為價值都是正數)
  4. 遍歷順序:先物品,再背包,并且背包要倒序遍歷(參考前面滾動數組)
  5. 舉例推導dp數組:以[1,5,11,5]為例,如圖

代碼:

class Solution {
public:bool canPartition(vector<int>& nums) {// 求和int sum = 0;for (int i : nums) sum+= i;// 和為奇數不可能有解if (sum % 2 == 1) return false;// 01背包int target = sum / 2;vector<int> dp(target+1, 0);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]);if (dp[j] == target) return true;}}return false;}
};

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

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

相關文章

centos查看空間使用情況

查看磁盤使用空間 df -h 查看該目錄下其他目錄的大小 du -sh *

自動化測試框架[Cypress 常見的“坑”]

Cypress命令是異步的 假設使用Selenium時&#xff0c;有如下這段代碼

Unity中顏色空間Gamma與Linear

文章目錄 前言一、人眼對光照的自適應1、光照強度與人眼所見的關系2、巧合的是&#xff0c;早期的電子脈沖顯示屏也符合這條曲線3、這兩條曲線都巧合的符合 y x^2.2^&#xff08;Gamma2.2空間&#xff09; 二、Gamma矯正1、沒矯正前&#xff0c;人眼看電子脈沖顯示屏&#xff…

學習筆記,http協議1.0,1.1,2.0之間的差別

文章目錄 前言http 1.1與http 1.0http 2.0 與http 1.x注意點 前言 僅做個人學習筆記記錄&#xff0c;如有錯誤&#xff0c;請多多包涵。 學習鏈接&#xff1a; HTTP 1.0與1.1、2.0之間的區別 面試官&#xff1a;說說 HTTP1.0/1.1/2.0 的區別? http 1.1與http 1.0 http協議1…

用 js 實現 判斷兩個數組是否相同

文章目錄 問題分析 問題 有數組 array1 和 array2 &#xff0c;如何判斷這兩個數組是否相同 分析 判斷兩個數組是否相同&#xff0c;你可以檢查它們的長度和每個元素是否相等。下面是一個示例代碼&#xff1a; function arraysAreEqual(arr1, arr2) {if (arr1.length ! arr2.…

事件溯源模式

概念解釋 事件溯源&#xff08;Event Sourcing&#xff09;是一種設計模式&#xff0c;其核心思想是將系統的狀態變化表示為一系列不可變的事件&#xff0c;并將這些事件存儲在事件日志中。系統的當前狀態可以通過重新應用&#xff08;回放&#xff09;這些事件來還原&#xf…

芯片的測試方法

半導體的生產流程包括晶圓制造和封裝測試&#xff0c;在這兩個環節中分別需要完成晶圓檢測(CP, Circuit Probing)和成品測試(FT, Final Test)。無論哪個環節&#xff0c;要測試芯片的各項功能指標均須完成兩個步驟&#xff1a;一是將芯片的引腳與測試機的功能模塊連接起來&…

促進材料基因工程基礎理論、前沿技術和關鍵裝備的發展和應用,第七屆材料基因工程高層論壇將于12月重慶舉辦,龍訊曠騰出席會議

為了進一步促進材料基因工程基礎理論、前沿技術和關鍵裝備的發展和應用&#xff0c;加強國際交流&#xff0c;加速我國新材料的研發和應用&#xff0c;由中國材料研究學會、西部科學城重慶高新區管理委員會主辦&#xff0c;重慶大學、北京科技大學、北京云智材料大數據研究院等…

【GUI】-- 14 GUI編程總結

GUI編程 05 GUI總結 在總結之前&#xff0c;先給出之前的貪吃蛇小游戲全代碼。 游戲的主啟動類&#xff1a; package com.duo.snake;import javax.swing.*;//游戲的主啟動類 public class StartGame {public static void main(String[] args) {JFrame frame new JFrame();…

Java面試-微服務篇-SpringCloud

Java面試-微服務篇-SpringCloud SpringCloud 常見組件注冊中心Eureka, Nacos負載均衡Ribbon服務雪崩, 熔斷降級微服務的監控來源 SpringCloud 常見組件 通常情況下 Eureka: 注冊中心Ribbon: 負載均衡Feign: 遠程調用Hystrix: 服務熔斷Zuul/Gateway: 網關 SpringCloudAlibaba…

【開源】基于Vue.js的天然氣工程運維系統的設計和實現

項目編號&#xff1a; S 022 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S022&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S022&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 系統角色分類2.2 核心功能2.2.1 流程…

服務限流算法:從令人頭疼到信手拈來

前言 隨著系統規模的擴大和用戶量的增加&#xff0c;服務限流成為了一個非常重要的話題。一方面&#xff0c;系統需要能夠處理大量的請求&#xff0c;不至于因為負載過高而崩潰&#xff1b;另一方面&#xff0c;又需要避免惡意攻擊或者其他異常情況對系統造成影響。本文將介紹…

npm相關和私有云

安裝node時npm會自動安裝&#xff0c;npm也可以單獨安裝。 package.json 在使用npm時&#xff0c;package.json文件是非常重要的&#xff0c;因為它包含了關于項目的必要信息&#xff0c;比如名稱、版本、依賴項等。在初始化新項目時&#xff0c;通常會使用npm init命令生成一…

pip安裝python包到指定python版本下

python -m pip install 包名1.命令行進入到指定python安裝目錄。比如我電腦上有python3.8也有python3.9。準備給python3.9安裝指定的包

【青書學堂】 2023年第二學期 HTML5+CSS3(直播課) 作業

【青書學堂】 2023年第二學期 HTML5CSS3(直播課) 作業 為了方便日后復習&#xff0c;青書學堂成人大專試題整理。 若有未整理的課程&#xff0c;請私信我補充&#xff0c;歡迎愛學習的同學們收藏點贊關注&#xff01;文章內容僅限學習使用&#xff01;&#xff01;&#xff01;…

3.OpenFeign的使用

OpenFeign 文章目錄 OpenFeign一. 什么是OpenFeign二. OpenFeign基礎使用1.添加依賴2.配置Nacos配置信息3.在項目中開啟OpenFeign4.編寫OpenFeign調用代碼5.調用OpenFeign接口 三. OpenFeign內置的超時重試機制1.配置超時重試2.覆蓋Retryer對象 四.自定義超時重試機制1.自定義超…

Hive中常出現的錯誤(不定時更新)

1.加載數據失敗 hive> load data local inpath /home/user/hive.txt into table studentl> ; FAILED: SemanticException [Error 10001]: Line 1:56 Table not found studentl hive> load data local inpath /home/user/hive.txt into table student; Loading data to…

技術分享| anyRTC之RTN網絡

RTN(Real-time Network)中文名&#xff1a;實時音視頻傳輸網絡。 RTN是最近幾年由各大RTC的云廠商提出的一個全新架構的音視頻實時傳輸網絡概念。類似于直播的CDN網絡&#xff0c;RTN是對音視頻的實時性又強烈要求的場景而設計的&#xff0c;原理上全球端到端的時延通過RTN網絡…

JSP EL表達式獲取list/Map集合與java Bean對象

上文 JSP EL表達式基本使用 中 我們對EL表達式做了一個基本的了解 也做了基礎的字符串數據使用 那么 我們可以來看一下我們的集合 首先 list 這個比較簡單 我們直接這樣寫代碼 <% page import"java.util.ArrayList" %> <% page import"java.util.Lis…