算法沉淀——動態規劃之01背包問題(leetcode真題剖析)

在這里插入圖片描述

算法沉淀——動態規劃之01背包問題

  • 01.【模板】01背包
  • 02.分割等和子集
  • 03.目標和
  • 04.最后一塊石頭的重量 II

01背包問題是一類經典的動態規劃問題,通常描述為:有一個固定容量的背包,以及一組物品,每件物品都有重量和價值,目標是找到在背包容量范圍內,使得背包中的物品總價值最大的組合。

具體來說,問題的輸入包括:

  1. 一個固定容量的背包(通常表示為一個整數W)。
  2. 一組物品,每個物品有兩個屬性:重量(通常表示為一個整數weight)和價值(通常表示為一個整數value)。
  3. 求解的目標是找到一種放置物品的方式,使得放入背包的物品的總重量不超過背包容量,并且總價值最大。

這個問題的特點是,對于每件物品,你只能選擇將其放入背包一次(0-1,因此稱為“01背包”),或者不放入背包。不能將物品切割成更小的部分放入背包,要么整個物品放入背包,要么不放入。

動態規劃解法

  1. 定義狀態: 通常使用二維數組dp[i][j]表示在前i個物品中,背包容量為j時的最大總價值。

  2. 狀態轉移方程: 考慮第i個物品,可以選擇放入背包或者不放入。如果選擇放入,那么總價值為dp[i-1][j-weight[i]] + value[i],即前i-1個物品的總價值加上當前物品的價值。如果選擇不放入,那么總價值為dp[i-1][j],即前i-1個物品的總價值。因此,狀態轉移方程為:

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

    其中,dp[i-1][j]表示不放入第i個物品,dp[i-1][j-weight[i]] + value[i]表示放入第i個物品。

  3. 初始條件:i=0時,表示前0個物品,總價值為0;當j=0時,表示背包容量為0,總價值也為0。

  4. 遍歷順序: 外層循環遍歷物品,內層循環遍歷背包容量。

  5. 返回結果: 最終結果存儲在dp[N][W]中,其中N為物品數量,W為背包容量。

例子

假設有如下物品:

Copy code解釋物品1:重量=2,價值=3
物品2:重量=3,價值=4
物品3:重量=4,價值=5
物品4:重量=5,價值=6

背包容量為W=8,我們要求解在這個條件下的最大總價值。

按照上述動態規劃解法,構建狀態轉移表如下:

luaCopy code解釋  重量/價值   0   1   2   3   4   5   6   7   8----------------------------------------------物品0        0   0   0   0   0   0   0   0   0物品1        0   0   3   3   3   3   3   3   3物品2        0   0   3   4   4   7   7   7  10物品3        0   0   3   4   4   7   8   8  11物品4        0   0   3   4   4   7   8   9  11

因此,最終結果為dp[4][8] = 11,表示在背包容量為8的情況下,最大總價值為11。這意味著最優解是選擇物品2和物品4放入背包。

01.【模板】01背包

題目鏈接:https://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e?tpId=230&tqId=2032484&ru=/exam/oj&qru=/ta/dynamic-programming/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196

你有一個背包,最多能容納的體積是V。

現在有n個物品,第i個物品的體積為vi,價值為wi。

(1)求這個背包至多能裝多大價值的物品?

(2)若背包恰好裝滿,求至多能裝多大價值的物品?

輸入描述

第一行兩個整數n和V,表示物品個數和背包體積。

接下來n行,每行兩個數vi和wi,表示第i個物品的體積和價值。

1≤n,V;vi,wi≤1000

輸出描述

輸出有兩行,第一行輸出第一問的答案,第二行輸出第二問的答案,如果無解請輸出0。

示例1

輸入

3 5
2 10
4 5
1 4

輸出

14
9

復制

說明:

裝第一個和第三個物品時總價值最大,但是裝第二個和第三個物品可以使得背包恰好裝滿且總價值最大。 

示例2

輸入

3 8
12 6
11 8
6 8

輸出

8
0

說明

裝第三個物品時總價值最大但是不滿,裝滿背包無解。 要求O(nV)的時間復雜度,O(V)空間復雜度

思路

第一問:

  1. 狀態表示:
    • dp[i][j] 表示從前 i 個物品中挑選,總體積不超過 j 的情況下,所有的選法中能挑選出的最大價值。
  2. 狀態轉移方程:
    • 對于每個物品,我們有兩種選擇:
      • 不選第 i 個物品:此時 dp[i][j] = dp[i - 1][j]
      • 選擇第 i 個物品:此時需要確保總體積不超過 j - v[i],而且該狀態是合法的,即 j >= v[i]dp[i - 1][j - v[i]] 存在。狀態轉移方程為 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i])
  3. 初始化:
    • 多加一行,第一行初始化為 0,因為不選任何物品總體積為 0時,價值為 0
  4. 填表順序:
    • 從上往下,每一行從左往右填表。
  5. 返回值:
    • 返回 dp[n][V],即最后一行最后一列的值。

第二問:

  1. 狀態表示:
    • dp[i][j] 表示從前 i 個物品中挑選,總體積正好等于 j 的情況下,所有的選法中能挑選出的最大價值。
  2. 狀態轉移方程:
    • dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i])
    • 在使用 dp[i - 1][j - v[i]] 時,需要判斷 j >= v[i]dp[i - 1][j - v[i]] 是否為 -1
  3. 初始化:
    • 多加一行,第一格初始化為 0,表示正好湊齊體積為 0的背包。
    • 第一行后面的格子初始化為 -1,因為沒有物品,無法滿足體積大于 0的情況。
  4. 填表順序:
    • 從上往下,每一行從左往右填表。
  5. 返回值:
    • 由于最后可能湊不成體積為 V 的情況,需要特判。

代碼

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;const int N=1002;
int n,V,v[N],w[N];
int dp[N][N];int main() {cin>>n>>V;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=n;i++)for(int j=0;j<=V;j++){dp[i][j]=dp[i-1][j];if(j>=v[i]) dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);}cout<<dp[n][V]<<endl;memset(dp,0,sizeof dp);for(int j=1;j<=V;j++) dp[0][j]=-1;for(int i=1;i<=n;i++)for(int j=0;j<=V;j++){dp[i][j]=dp[i-1][j];if(j>=v[i]&&dp[i-1][j-v[i]]!=-1)dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+w[i]);}cout<<(dp[n][V]==-1?0:dp[n][V])<<endl;
}

優化步驟:

  1. 滾動數組的應用:
    • 在01背包問題中,通過滾動數組可以刪去所有的橫坐標,因為狀態 dp[i][j] 只依賴于上一行的狀態 dp[i-1][j]dp[i-1][j-v[i]],因此只需保留一行狀態。
  2. 遍歷順序修改:
    • 修改了 j 的遍歷順序,原本的遍歷是從 0V,現在改為從 V0。這樣做的原因是,如果從 0V 遍歷,會使用當前行的 dp[i-1][j-v[i]] 的值,而我們已經在上一步的滾動數組中刪除了這一行,所以需要改變遍歷順序,從 V0
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;const int N=1002;
int n,V,v[N],w[N];
int dp[N];int main() {cin>>n>>V;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=n;i++)for(int j=V;j>=v[i];j--)dp[j]=max(dp[j],dp[j-v[i]]+w[i]);cout<<dp[V]<<endl;memset(dp,0,sizeof dp);for(int j=1;j<=V;j++) dp[j]=-1;for(int i=1;i<=n;i++)for(int j=V;j>=v[i];j--)if(dp[j-v[i]]!=-1)dp[j]=max(dp[j],dp[j-v[i]]+w[i]);cout<<(dp[V]==-1?0:dp[V])<<endl;
}

02.分割等和子集

題目鏈接:https://leetcode.cn/problems/partition-equal-subset-sum/

給你一個 只包含正整數非空 數組 nums 。請你判斷是否可以將這個數組分割成兩個子集,使得兩個子集的元素和相等。

示例 1:

輸入:nums = [1,5,11,5]
輸出:true
解釋:數組可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

輸入:nums = [1,2,3,5]
輸出:false
解釋:數組不能分割成兩個元素和相等的子集。

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100

思路

  1. 狀態表達:
    • dp[i][j] 表示在前 i 個元素中選擇,所有的選法中,能否湊成總和為 j 這個數。
  2. 狀態轉移方程:
    • 根據最后一個位置的元素,分兩種情況討論:
      • 不選擇 nums[i]:此時是否能夠湊成總和為 j 取決于前 i-1 個元素的情況,即 dp[i][j] = dp[i-1][j]
      • 選擇 nums[i]:如果 nums[i] 小于等于 j,則需要看前 i-1 個元素中是否能湊成總和為 j - nums[i],即 dp[i][j] = dp[i][j] || dp[i-1][j - nums[i]]
  3. 初始化:
    • 第一行表示不選擇任何元素,要湊成目標和 j,只有當目標和為 0 時才能做到,因此第一行僅需初始化第一個元素 dp[0][0] = true
  4. 填表順序:
    • 根據狀態轉移方程,從上往下填寫每一行,每一行的順序是無所謂的。
  5. 返回值:
    • 根據狀態表達,返回 dp[n][aim] 的值,其中 n 表示數組的大小, aim 表示要湊的目標和。
  6. 空間優化:
    • 對于 01 背包類型的問題,可以進行空間上的優化,即刪除第一維,并修改第二層循環的遍歷順序。

代碼

class Solution {
public:bool canPartition(vector<int>& nums) {int n=nums.size(),sum=0;for(int x:nums) sum+=x;if(sum%2) return false;int aim=sum/2;vector<vector<bool>> dp(n+1,vector<bool>(aim+1));for(int i=0;i<=n;i++) dp[i][0]=true;for(int i=1;i<=n;i++)for(int j=1;j<=aim;j++){dp[i][j]=dp[i-1][j];if(j>=nums[i-1]) dp[i][j]=dp[i][j]||dp[i-1][j-nums[i-1]];}return dp[n][aim];}
};

空間優化

class Solution {
public:bool canPartition(vector<int>& nums) {int n=nums.size(),sum=0;for(int x:nums) sum+=x;if(sum%2) return false;int aim=sum/2;vector<bool> dp(aim+1);dp[0]=true;for(int i=1;i<=n;i++)for(int j=aim;j>=nums[i-1];j--)dp[j]=dp[j]||dp[j-nums[i-1]];return dp[aim];}
};

03.目標和

題目鏈接:https://leetcode.cn/problems/target-sum/

給你一個非負整數數組 nums 和一個整數 target

向數組中的每個整數前添加 '+''-' ,然后串聯起所有整數,可以構造一個 表達式

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串聯起來得到表達式 "+2-1"

返回可以通過上述方法構造的、運算結果等于 target 的不同 表達式 的數目。

示例 1:

輸入:nums = [1,1,1,1,1], target = 3
輸出:5
解釋:一共有 5 種方法讓最終目標和為 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3

示例 2:

輸入:nums = [1], target = 1
輸出:1

提示:

  • 1 <= nums.length <= 20
  • 0 <= nums[i] <= 1000
  • 0 <= sum(nums[i]) <= 1000
  • -1000 <= target <= 1000

思路

  1. 狀態表示:
    • dp[i][j] 表示在前 i 個數中選,總和正好等于 j,一共有多少種選法。
  2. 狀態轉移方程:
    • 根據最后一個位置的元素,結合題目的要求,有兩種策略:
      • 不選 nums[i]:此時湊成總和 j 的總方案數,要看在前 i-1 個元素中選,湊成總和為 j 的方案數,即 dp[i][j] = dp[i-1][j]
      • 選擇 nums[i]:如果 nums[i] 小于等于 j,則需要看前 i-1 個元素中是否能湊成總和為 j - nums[i],即 dp[i][j] += dp[i-1][j - nums[i]]
  3. 初始化:
    • 需要用到上一行的數據,因此初始化第一行,表示不選擇任何元素湊成目標和 j。只有當目標和為 0 時才能做到,因此第一行僅需初始化第一個元素 dp[0][0] = 1
  4. 填表順序:
    • 根據狀態轉移方程,從上往下填寫每一行,每一行的順序是無所謂的。
  5. 返回值:
    • 根據狀態表示,返回 dp[n][aim] 的值,其中 n 表示數組的大小, aim 表示要湊的目標和。

代碼

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum=0;for(auto x:nums) sum+=x;int aim=(sum+target)/2;if(aim<0||(sum+target)%2) return 0;int n=nums.size();vector<vector<int>> dp(n+1,vector<int>(aim+1));dp[0][0]=1;for(int i = 1; i <= n; i++) for(int j = 0; j <= aim; j++){dp[i][j] = dp[i - 1][j];if(j >= nums[i - 1]) dp[i][j] += dp[i - 1][j - nums[i - 1]];}return dp[n][aim];}
};

04.最后一塊石頭的重量 II

題目鏈接:https://leetcode.cn/problems/last-stone-weight-ii/

有一堆石頭,用整數數組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。

每一回合,從中選出任意兩塊石頭,然后將它們一起粉碎。假設石頭的重量分別為 xy,且 x <= y。那么粉碎的可能結果如下:

  • 如果 x == y,那么兩塊石頭都會被完全粉碎;
  • 如果 x != y,那么重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭新重量為 y-x

最后,最多只會剩下一塊 石頭。返回此石頭 最小的可能重量 。如果沒有石頭剩下,就返回 0

示例 1:

輸入:stones = [2,7,4,1,8,1]
輸出:1
解釋:
組合 2 和 4,得到 2,所以數組轉化為 [2,7,1,8,1],
組合 7 和 8,得到 1,所以數組轉化為 [2,1,1,1],
組合 2 和 1,得到 1,所以數組轉化為 [1,1,1],
組合 1 和 1,得到 0,所以數組轉化為 [1],這就是最優值。

示例 2:

輸入:stones = [31,26,33,21,40]
輸出:5

提示:

  • 1 <= stones.length <= 30
  • 1 <= stones[i] <= 100

思路

  1. 狀態表示:
    • dp[i][j] 表示在前 i 個元素中選擇,總和不超過 j 的情況下,這些元素的最大和。
  2. 狀態轉移方程:
    • 根據最后一個位置的元素,結合題目的要求,有兩種策略:
      • 不選 stones[i]:此時是否能夠湊成總和為 j,要看在前 i-1 個元素中選,能否湊成總和為 j。根據狀態表示,此時 dp[i][j] = dp[i-1][j]
      • 選擇 stones[i]:這種情況下是有前提條件的,此時的 stones[i] 應該是小于等于 j。因為如果這個元素都比要湊成的總和大,選擇它就沒有意義。那么是否能夠湊成總和為 j,要看在前 i-1 個元素中選,能否湊成總和為 j - stones[i]。根據狀態表示,此時 dp[i][j] = dp[i-1][j-stones[i]] + stones[i]
  3. 初始化:
    • 由于需要用到上一行的數據,可以先將第一行初始化。
    • 第一行表示「沒有石頭」,因此想湊成目標和 j 的最大和都是 0
  4. 填表順序:
    • 根據狀態轉移方程,從上往下填寫每一行,每一行的順序是無所謂的。
  5. 返回值:
    • 根據狀態表示,找到最接近 sum / 2 的最大和 dp[n][sum / 2]
    • 返回 sum - 2 * dp[n][sum / 2],因為我們要的是兩堆石頭的差。

代碼

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum=0;for(int x:stones) sum+=x;int n=stones.size(),m=sum/2;vector<vector<int>> dp(n+1,vector<int>(m+1));for(int i=1;i<=n;i++)for(int j=0;j<=m;j++){dp[i][j]=dp[i-1][j];if(j>=stones[i-1]) dp[i][j]=max(dp[i][j],dp[i-1][j-stones[i-1]]+stones[i-1]);}return sum-2*dp[n][m];}
};

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

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

相關文章

c++基礎學習第二天(數組,函數)

提示&#xff1a;c基礎學習第二天&#xff08;數組&#xff0c;函數&#xff09; 文章目錄 1、數組1.1、 概述1.2、一維數組1.2.1、一維數組定義方式1.2.2、一維數組名稱的用途. 1.3、 二維數組1.3.1、二維數組定義方式1.3.2、二維數組數組名的用途 2、函數2.1、概述2.2、函數的…

云計算 2月28號 (linux的磁盤分區)

一 存儲管理 主要知識點: 基本分區、邏輯卷LVM、EXT3/4/XFS文件系統、RAID 初識硬盤 機械 HDD 固態 SSD SSD的優勢 SSD采用電子存儲介質進行數據存儲和讀取的一種技術&#xff0c;擁有極高的存儲性能&#xff0c;被認為是存儲技術發展的未來新星。 與傳統硬盤相比&#xff0c…

Vue 3 中的 Composition API 詳解

Vue.js&#xff0c;作為前端領域流行的框架之一&#xff0c;以其響應式數據綁定和組件化開發贏得了廣大開發者的喜愛。隨著前端技術的不斷發展和項目復雜度的增加&#xff0c;Vue 團隊推出了 Vue 3&#xff0c;并引入了 Composition API&#xff0c;以更好地滿足復雜應用的需求…

深度偽造,讓網絡釣魚更加難以辨別

網絡釣魚一直是安全領域的一個突出話題&#xff0c;盡管這類詐騙形式已經存在了幾十年&#xff0c;依舊是欺詐攻擊或滲透組織的最有效方法之一。詐騙分子基于社會工程原理&#xff0c;通過郵件、網站以及電話、短信和社交媒體&#xff0c;利用人性&#xff08;如沖動、不滿、好…

嵌入式驅動學習第二周——Linux內核打印

前言 這篇博客來聊一聊Linux內核打印。 嵌入式驅動學習專欄將詳細記錄博主學習驅動的詳細過程&#xff0c;未來預計四個月將高強度更新本專欄&#xff0c;喜歡的可以關注本博主并訂閱本專欄&#xff0c;一起討論一起學習。現在關注就是老粉啦&#xff01; 目錄 前言1. dmesg指令…

react diff

react diff算法為降低算法復雜度提出了三大策略&#xff1a; 1.只進行同級比較 2.節點類型比較&#xff0c;不同元素生成不同的fiber樹 3.key作為元素的唯一標識 diff算法流程 diff算法需要進行兩輪遍歷&#xff1a; 第一輪遍歷更新的節點。 第二輪遍歷沒更新的節點。 第一輪…

【LeetCode:225. 用隊列實現棧 + 棧 | 隊列】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

水牛社軟件是真的嗎?

軟件是真的&#xff0c;不過畢竟是為了賺錢或者獲取資源而買的&#xff0c;所以大部分只關心能賺多少錢吧 說實話&#xff0c;我用了2年了&#xff0c;一些獨立的項目還有群&#xff0c;有一月掙幾千上萬的&#xff0c;有一月賺幾百的 軟件是一個集合體&#xff0c;不是像很多…

【leetcode刷題之路】面試經典150題(5)——二叉樹+二叉樹層次遍歷+二叉搜索樹

文章目錄 9 二叉樹9.1 【遞歸】二叉樹的最大深度9.2 【遞歸】相同的樹9.3 【遞歸】翻轉二叉樹9.4 【遞歸】對稱二叉樹9.5 【遞歸】從前序與中序遍歷序列構造二叉樹9.6 【遞歸】從中序與后序遍歷序列構造二叉樹9.7 【BFS】填充每個節點的下一個右側節點指針 II9.8 【遞歸】二叉樹…

代碼隨想錄第二十七天 455.分發餅干 376.擺動序列 53.最大子序和 122.買賣股票的最佳時機II

LeetCode 455 分發餅干 題目描述 假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。 對每個孩子 i&#xff0c;都有一個胃口值 g[i]&#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1b;并且每塊餅…

2024全國護網行動HW行動招聘/收人!!!

2024全國護網行動HW行動招聘 溯蓉信創開始收人啦&#xff01;&#xff01;&#xff01;現在開始收錄2024HW簡歷&#xff0c;感興趣的小伙伴掃碼二維碼添加微信 我們簽約后&#xff0c;入場即預付款3k&#xff0c;簽約后我們會在HW之前對我們的人員進行HW培訓&#xff0c;保證上…

Three.js--》探尋Cannon.js構建震撼的3D物理交互體驗(一)

我們用three.js可以繪制出各種酷炫的畫面&#xff0c;但是當我們想要一個更加真實的物理效果的話&#xff0c;這個時候我們就需要一個物理的庫&#xff0c;接下來我們就講解一下今天要學習的canon&#xff0c;它可以給我們提供一個更加真實的物理效果&#xff0c;像物體的張力、…

YOLOv8姿態估計實戰:訓練自己的數據集

課程鏈接&#xff1a;https://edu.csdn.net/course/detail/39355 YOLOv8 基于先前 YOLO 版本的成功&#xff0c;引入了新功能和改進&#xff0c;進一步提升性能和靈活性。YOLOv8 同時支持目標檢測和姿態估計任務。 本課程以熊貓姿態估計為例&#xff0c;將手把手地教大家使用C…

Mysql實戰(2)之MySQL執行流程

-- 查看mysql當前有多少連接 show global status like Thread%; /* Threads_cached&#xff1a;緩存中的線程連接數 Threads_connected&#xff1a;當前打開的連接數 Threads_created&#xff1a;為處理連接創建的線程數 Threads_running&#xff1a;非睡眠狀態的連接數&…

windows部署mariadb-11.3

因為需要用到數據庫來處理一些東西,所以決定在windows上安裝一下MariaDB. 隨著版本升級,安裝已經不是那么復雜了.對應的.其實網上一大堆的檢索結果,很多并不可用. 由于是開發環境,這里一切從簡了. 下載安裝包.并解壓進入bin目錄,使用mysql_install_db.exe程序來進行安裝.執行 m…

MSCKF5講:后端代碼分析

MSCKF5講&#xff1a;后端代碼分析 文章目錄 MSCKF5講&#xff1a;后端代碼分析1 初始化initialize()1.1 加載參數1.2 初始化IMU連續噪聲協方差矩陣1.3 卡方檢驗1.4 接收與訂閱話題createRosIO() 2 IMU靜止初始化3 重置resetCallback()4 featureCallback4.1 IMU初始化判斷4.2 I…

【文末送書】智能計算:原理與實踐

歡迎關注博主 Mindtechnist 或加入【智能科技社區】一起學習和分享Linux、C、C、Python、Matlab&#xff0c;機器人運動控制、多機器人協作&#xff0c;智能優化算法&#xff0c;濾波估計、多傳感器信息融合&#xff0c;機器學習&#xff0c;人工智能等相關領域的知識和技術。關…

Linux系統運維腳本:一鍵添加防火墻規則(開啟服務和網絡端口)

目 錄 一、要求 二、解決方案 &#xff08;一&#xff09;解決思路 &#xff08;二&#xff09;方案 三、腳本程序實現 &#xff08;一&#xff09;腳本代碼和解釋 1、腳本代碼 2、代碼解釋 &#xff08;二&#xff09;腳本驗證 1、腳本編輯 2、給予執行權限…

NumPy數據處理詳解的筆記2

NumPy數據處理詳解的筆記2 第1章NumPy基礎 NumPy是用于處理多維數組的數值運算庫&#xff0c;不僅可用于 機器學習&#xff0c;還可以用于圖像處理&#xff0c;語言處理等任務。 1.2 多維數據結構ndarray的基礎 在學習NumPy的過程中&#xff0c;只要理解了ndarray的相關知識…

java 關于 Object 類中的 wait 和 notify 方法。(生產者和消費者模式!)

4、關于 Object 類中的 wait 和 notify 方法。&#xff08;生產者和消費者模式&#xff01;&#xff09; 第一&#xff1a;wait 和 notify 方法不是線程對象的方法&#xff0c;是 java 中任何一個 java 對象都有的方法&#xff0c;因為這兩個方法是 Object 類中自帶的。 wait 方…