代碼隨想錄 day 35 動態規劃

第九章 動態規劃part03

正式開始背包問題,背包問題還是挺難的,雖然大家可能看了很多背包問題模板代碼,感覺挺簡單,但基本理解的都不夠深入。
如果是直接從來沒聽過背包問題,可以先看文字講解慢慢了解 這是干什么的。
如果做過背包類問題,可以先看視頻,很多內容,是自己平時沒有考慮到位的。
背包問題,力扣上沒有原題,大家先了解理論,今天就安排一道具體題目。
掌握01背包,和完全背包,就夠用了,最多可以再來一個多重背包。
詳細布置

01背包問題 二維

https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html
視頻講解:https://www.bilibili.com/video/BV1cg411g7Y6

01背包問題 一維

https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-2.html
視頻講解:https://www.bilibili.com/video/BV1BU4y177kY

01背包總結

416. 分割等和子集

本題是 01背包的應用類題目
https://programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html
視頻講解:https://www.bilibili.com/video/BV1rt4y1N7jE

01背包

題目鏈接

https://kamacoder.com/problempage.php?pid=1046

解題思路

什么是01背包?

背包問題的理論基礎重中之重是01背包,一定要理解透!

有n件物品和一個最多能背重量為w 的背包。第i件物品的重量是weight[i],得到的價值是value[i] 。每件物品只能用一次,求解將哪些物品裝入背包里物品價值總和最大。
image.png

自底向上思考,暴力解法如何做?

每一件物品只有倆個狀態,取或不取,所以可以使用回溯法搜索出所有的情況,那么時間復雜度就是O(2^n),n表示物品數量
所以暴力的解法是指數級別的時間復雜度。進而才需要動態規劃的解法來進行優化!

public class BagProblem {/*** 有n件物品和一個最多能背重量為w 的背包。第i件物品的重量是weight[i],得到的價值是value[i] 。* 每件物品只能用一次,求解將哪些物品裝入背包里物品價值總和最大。**/int maxValue=0;List<Integer> bagLog =new ArrayList<>();int curWeight=0;int curValue=0;public void backtracking(int bagSize,int [] weight,int [] value,int startIndex){if(curWeight>bagSize){return;}//遍歷物品for(int i=startIndex;i<weight.length;i++){if(curWeight+weight[i]>bagSize){break;}bagLog.add(i);curValue+=value[i];curWeight+=weight[i];System.out.println("當前背包的物品:"+ bagLog.toString() +"價值:"+curValue);maxValue=Math.max(maxValue,curValue);backtracking(bagSize,weight,value,i+1);if(bagLog.size()==weight.length){return;}curValue-=value[i];curWeight-=weight[i];bagLog.remove(bagLog.size()-1);}}public  int bagProblemWithBacktracking(int bagSize,int [] weight,int [] value){backtracking(bagSize,weight,value,0);return maxValue;}public static void main(String[] args) {int[] weight = {1,3,4};int[] value = {15,20,30};int bagSize = 10;BagProblem bagProblem = new BagProblem();int _maxValue = bagProblem.bagProblemWithBacktracking(bagSize, weight, value);System.out.printf(""+_maxValue);}}
二維dp數組01背包

:::tips
動規五步曲分析
1.確定dp數組以及下標的含義
對于背包問題,有一種寫法, 是使用二維數組,即dp[i][j] 表示從下標為[0-i]的物品里任意取,放進容量為j的背包,價值總和最大是多少
二維數組如圖所示,要時刻記著dp數組的含義,i代表什么 j代表什么

2.確定遞推公式
再回顧一下dp[i][j]的含義:從下標為[0-i]的物品里任意取,放進容量為j的背包,價值總和最大是多少。
那么可以有兩個方向推出來dp[i][j]
2.1 不放物品i : 由dp[i - 1][j]推出 此時dp[i][j]=dp[i-1][j]
(其實就是當物品i的重量大于背包j的重量時,物品i無法放進背包中,所以背包內的價值依然和前面相同)
2.2 放物品i : 由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 為背包容量為j - weight[i]的時候不放物品i的最大價值,value[i]是物品i的價值,那么dp[i - 1][j - weight[i]] + value[i] ,就是背包放物品i得到的最大價值
所以遞推公式是: dp[i][j]=Math.max(dp [i-1] [j], dp [i-1] [j - weight[i] ]+value[i])

進一步理解疑惑,這里為什么取最大,為什么j-weight[i]?
因為這里放物品i 不是說你的背包是無限大的,直接就放進去,比如:你背包重量是5,當前背包有
i1 重量是1 i2 重量是2 i3重量是1 ,此時來到背包重量5,物品i4的重量是4,你要想能放物品i4,n你就得j-weight[i4] =1 , 那么現在背包有物品i1 + 物品i4 ,這時候就要比較 i1,i4的價值大還是i1,i2,i3的價值大,是不確定的,所以要取他倆的最大值。
j - weight[i] 的意思是要確保能放進去 weight[i] 才能加入背包,也就是背包容量為j - weight[i]的價值是多少 再加上 value[i] ,當然你能不能讓數組越界 j - weight[i] <0 根本就放不下這個物品,還是要取dp [i-1] [j]
3.dp數組如何初始化
關于初始化,一定要和dp數組的定義吻合,否則到遞推公式的時候就會越來越亂。
3.1首先從dp[i][j]的定義出發,如果背包容量j為0的話,即dp[i][0],無論是選取哪些物品,背包價值總和一定為0

3.2在看其他情況,狀態轉移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1 推導出來,那么i為0的時候就一定要初始化
** j < weight[0]的時候,dp[0][j] 應該是 0,因為背包容量比編號0的物品重量還小**
當j >= weight[0]時,dp[0][j] 應該是value[0],因為背包容量放足夠放編號0物品

所以初始化如圖

4.確定遍歷順序
如上圖所示有倆個遍歷維度,物品與背包重量
遍歷物品更好理解,因為邏輯上是取物品放到背包里面嘛,但在二維里都可以。
為什么都可以的呢?
要理解遞歸的本質和遞推的方向
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[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括正上方向)

無非就豎或橫著填充二維數組,雖然兩個for循環遍歷的次序不同,但是dp[i][j]所需要的數據就是左上角,根本不影響dp[i][j]公式的取值 推導!

5.舉例推導dp數組

最終結果就是dp[2][4]。

總結:
做動態規劃的題目,最好的過程就是自己在紙上舉一個例子把對應的dp數組的數值推導一下,然后在動手寫代碼!
:::

public class BagProblem {public int bagProblem(int bagSize,int[] weight,int[] value){//1.確定dp數組以及下標的含義//dp[i][j] 任取0-i物品放進重量為j的背包的最大價值//2.確定遞推公式//dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])//3.如何初始化dp數組int dp[][]=new int[weight.length][bagSize+1];//weight.length 物品大小//3.1 背包重量是0的時候放不下物品 初始化價值為0, java int數組默認是0//3.2 遞推公式由i-1推出,要初始化dp[0,j]的值for (int j = 0; j <= bagSize ; j++) {if(j>=weight[0]){dp[0][j]=value[0];}}//4.確定遍歷順序for(int i=1;i<weight.length;i++){//遍歷物品for(int j=1;j<=bagSize;j++){//遍歷背包重量//處理 j-weight[i] 小于0的情況放不下物品iif(j<weight[i]){dp[i][j]=dp[i-1][j];}else {dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);}}}//5.打印dp數組for(int i=0;i<weight.length;i++){for(int j=0;j<=bagSize;j++){System.out.print(dp[i][j] + "\t");}System.out.println();}//最后一個位置就是答案return dp[weight.length-1][bagSize];}public static void main(String[] args) {int[] weight = {1,3,4};int[] value = {15,20,30};int bagSize = 4;int maxValue = new BagProblem().bagProblem(bagSize, weight, value);System.out.println("最大值:"+maxValue);}
}

image.png

滾動數組(一維dp數組)01背包

:::tips
滾動數組就是把二維dp降為一維dp
image.png
對于背包問題其實狀態都是可以壓縮的。
在使用二維數組的時候,遞推公式: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[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
一維dp數組,其實就是上一層dp[i-1] 這一層拷貝到dp[i]
dp[j]=max(dp[j],dp[j-weight[i]] + value[i])
此時dp[j]有兩個選擇:
一個是取自己dp[j] 相當于 二維dp數組中的dp[i-1][j],即不放物品i
一個是取dp[j - weight[i]] + value[i],即放物品i
指定是取最大的,畢竟是求最大價值。
3.一維dp數組的初始化
dp[j]表示:容量為j的背包,所背的物品價值可以最大為dp[j],那么dp[0]就應該是0,因為背包容量為0所背的物品的最大價值就是0。
那么dp數組除了下標0的位置,初始為0,其他下標應該初始化多少呢?
看一下遞歸公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
dp數組在推導的時候一定是取價值最大的數,如果題目給的價值都是正整數那么非0下標都初始化為0就可以了。
這樣才能讓dp數組在遞歸公式的過程中取的最大的價值,而不是被初始值覆蓋了。
那么我假設物品價值都是大于0的,所以dp數組初始化的時候,都初始為0就可以了。

4.一維dp數組遍歷順序
只能先遍歷物品在遍歷背包,且背包要倒序
二維dp遍歷的時候,背包容量是從小到大,而一維dp遍歷的時候,背包是從大到小。
**遍歷背包為什么倒序呢?**因為數組是壓縮的,不再是像二維那樣依賴上一層的互不影響
倒序遍歷是為了保證物品i只被放入一次!。但如果一旦正序遍歷了,那么物品0就會被重復加入多次!
舉一個例子:物品0的重量weight[0] = 1,價值value[0] = 15
如果正序遍歷
dp[1] = dp[1 - weight[0]] + value[0] = 15
dp[2] = dp[2 - weight[0]] + value[0] = 30
此時dp[2]就已經是30了,意味著物品0,被放入了兩次,所以不能正序遍歷。
為什么倒序遍歷,就可以保證物品只放入一次呢?
倒序就是先算dp[2]
dp[2] = dp[2 - weight[0]] + value[0] = 15 (dp數組已經都初始化為0)
dp[1] = dp[1 - weight[0]] + value[0] = 15
所以從后往前循環,每次取得狀態不會和之前取得狀態重合,這樣每種物品就只取一次了。
二維不用倒序是因為dp[i][j]都是通過上一層dp[i-1][j]而來

為什么不可以先遍歷背包在遍歷物品?
因為背包容量是倒序遍歷,如果這樣背包里就會只放一個物品,舉個例子試下就知道了
例如:遍歷背包容量第一次取容量是4, 取物品0放入, 取物品1 dp[j-weight[1]] 它是空值 +value[i],此時背包就只有物品i ,因為是從后向前,前面不可能有值,最終背包容量是4的,只有一個價值最大的物品是不對的。

5.舉例推導dp數組

:::

public class BagProblem {public int bagProblem(int bigSize,int[] weight,int[] value){//1.確定dp數組以及下標的含義//dp[j] 容量為j的背包,所背物品的最大價值為dp[j]//2.確定遞推公式//dp[j]=Math.max(dp[j],dp[j-weight[i]]+value[i])//3.初始化int [] dp=new int[bigSize+1];Arrays.fill(dp,0);//4.確定遍歷順序 先遍歷物品在遍歷背包,背包要倒序for(int i=0;i<weight.length;i++){//遍歷物品//for(int j=bigSize;j>=weight[i];j--){//    dp[j]=Math.max(dp[j],dp[j-weight[i]]+value[i]);//}//方便打印全部dp數組,實際寫用上面注釋的遍歷方式for(int j=bigSize;j>=0;j--){//遍歷背包重量if(j<weight[i]){//確保要當前背包可以裝的下物品idp[j]=dp[j];//這里不用寫,裝不下物品i了,因為是滾動數組,維持原來的物品,上面的循環省去了額外遍歷還是有好處的}else {dp[j]=Math.max(dp[j],dp[j-weight[i]]+value[i]);}System.out.print(dp[j]+"\t");}System.out.println();}//5.舉例推導dp數組return dp[bigSize];}public static void main(String[] args) {int[] weight = {1,3,4};int[] value = {15,20,30};int bagSize = 4;int maxValue = new BagProblem().bagProblem(bagSize, weight, value);System.out.println("最大值:"+maxValue);}}

這里打印出的背包遍歷順序是4-0 ,下圖打印的第一個位置就是dp數組的4號位置,最后一個位置是dp數組的0號位置,因為打印先處理的背包4號位置->3…0。
解釋的意思是不要產生誤會,看打印然后取dp[0],實際取dp[4] 就是dp[bigSize]。
image.png
for(int j=bigSize;j>=weight[i];j–) 這個循環明顯執行次數更少
image.png

正常想的模擬圖應該這么畫,實際對應dp數組打印的翻轉,你應該懂的!

416. 分割等和子集

題目鏈接

https://leetcode.cn/problems/partition-equal-subset-sum/description/

解題思路

要明確本題中我們要使用的是01背包,因為元素我們只能用一次。
回歸主題:首先,本題要求集合里能否出現總和為 sum / 2 的子集。
那么來一一對應一下本題,看看背包問題如何來解決。

只有確定了如下四點,才能把01背包問題套到本題上來。
背包的體積為sum / 2
背包要放入的商品(集合里的元素)重量為 元素的數值,價值也為元素的數值
背包如果正好裝滿,說明找到了總和為 sum / 2 的子集。
背包中每一個元素是不可重復放入。

code

class Solution {// 只有確定了如下四點,才能把01背包問題套到本題上來。// 背包的體積為sum / 2// 背包要放入的商品(集合里的元素)重量為 元素的數值,價值也為元素的數值// 背包如果正好裝滿,說明找到了總和為 sum / 2 的子集。// 背包中每一個元素是不可重復放入。public boolean canPartition(int[] nums) {int sum=Arrays.stream(nums).sum();if(sum%2==1){return false;}//1.確定dp數組以及下標的含義//01背包中,dp[j] 表示: 容量為j的背包,所背的物品價值最大可以為dp[j]。//j 是sum/2 物品就是子集//2.確定遞推公式//01背包的遞推公式為:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);//本題,相當于背包里放入數值,那么物品i的重量是nums[i],其價值也是nums[i]//dp[j]=Math.max(dp[j],dp[j=nums[i]+nums[i]]);//3.dp數組如何初始化int bagSize=sum/2;int[] dp=new int[bagSize+1];Arrays.fill(dp,0);//4.確定遍歷順序for(int i=0;i<nums.length;i++){for(int j=bagSize;j>=nums[i];j--){dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);}}//dp[bagSize] 計算出背包的最大數值,必定是裝滿 //題目要求倆個子集相等,sum/2代表,倆個子集的值//那么sum/2=bagSize = dp[bagSize] 就說明存在這倆個子集return dp[bagSize]==bagSize;}
}

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

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

相關文章

大數據探索性分析——抽樣技術應用

2.3 概率抽樣 一、簡單隨機抽樣 # 數據預處理 LoanStats3c read.csv("D:/OneDrive - stu.fynu.edu.cn/大四上學期/ysq-大數據探索性分析/data/2數據集二&#xff1a;Loan Data--Lending Club/LoanStats3c/LoanStats3c.csv", header TRUE, fill TRUE, comment.char…

20 webUI應用中Controlnet精講(06)-結構理解與其它

前面的篇章已經詳細講解了線條約束、三維關系與空間深度、人體姿態等幾類controlnet的功能與應用&#xff0c;本節內容將對通過controlnet對圖像的結構理解及控圖效果。 序號 分類 Controlnet名稱 備注 1 線條約束 Canny&#xff08;硬邊緣&#xff09; 約束性強&#x…

【MFC】對話框屬性:Center(居中)

前言 本文介紹對話框屬性中的Center(居中)&#xff0c;同時給出相關示例便于理解。 目錄1 位置2 詳解3 示例1 位置 首先介紹一下這個屬性在哪里。 在資源視圖中雙擊對話框節點&#xff0c;打開該對話框&#xff1b; 鼠標右鍵工作區空白處&#xff0c;單擊屬性&#xff1b; 此時…

SciKit-Learn 全面分析分類任務 breast_cancer 數據集

背景 乳腺癌數據集&#xff0c;569個樣本&#xff0c;30個特征&#xff0c;2個類別&#xff08;良性/惡性&#xff09; 步驟 加載數據集拆分訓練集、測試集數據預處理&#xff08;標準化&#xff09;選擇模型模型訓練&#xff08;擬合&#xff09;測試模型效果評估模型 分析方法…

【開題答辯全過程】以 _基于SpringBoot技術的“樹洞”心理咨詢服務平臺的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

R 語法高亮為什么沒有,是需要安裝專用的編輯軟件,R語言自帶的R-gui 功能還是比較簡單

R 語法高亮為什么沒有&#xff0c;是需要安裝專用的編輯軟件&#xff0c;R語言自帶的R-gui 功能還是比較簡單 以下是一些主流的 R 編輯軟件&#xff08;IDE / 編輯器&#xff09;&#xff0c;適用于不同需求的用戶&#xff1a; ? 最推薦&#xff1a;RStudio&#xff08;免費/…

使用UniApp實現下拉框和表格組件頁面

使用UniApp實現下拉框和表格組件頁面UniApp提供了一套完整的跨平臺開發框架&#xff0c;支持在多個平臺上運行。下拉框和表格是常見的UI組件&#xff0c;可以通過UniApp內置組件或第三方插件實現。下拉框組件的實現UniApp內置的<picker>組件可以實現下拉選擇功能。以下是…

JavaScript 對象說明

JavaScript 對象說明 1. 對象的基本概念 在 JavaScript 中&#xff0c;對象是一種復合數據類型&#xff0c;用于存儲相關聯的屬性和方法。對象可以看作是屬性的集合&#xff0c;其中每個屬性都由一個鍵&#xff08;key&#xff09;和一個值&#xff08;value&#xff09;組成。…

【競賽系列】機器學習實操項目04——客戶信用評估模型開發全流程(baseline)

上一章&#xff1a;機器學習實操項目03——Scikit-learn介紹及簡單分類案例 下一章&#xff1a; 機器學習核心知識點目錄&#xff1a;機器學習核心知識點目錄 機器學習實戰項目目錄&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大…

C++中的單例模式的實現

1 什么是單例模式單例模式 是一種創建型設計模式&#xff0c;確保一個類在整個程序生命周期中只有一個實例&#xff0c;并提供一個全局訪問點。核心要求&#xff1a;類不能被外部隨意創建&#xff08;禁止 public 構造函數或限制實例數量&#xff09;。不能被復制或移動。提供一…

匯編基礎1

1.格式偽操作&#xff1a;它們不是ARM處理器實際的指令&#xff08;如MOV&#xff0c; ADD等&#xff09;&#xff0c;而是寫給匯編器看的命令&#xff0c;用于指導匯編器如何工作area reset, code, readonlycode32entry內容 endarea: 這是最重要的一個偽操作&#xff0c;用…

設計模式(C++)詳解—單例模式(2)

<摘要> 單例模式是創建型設計模式中最簡單但應用最廣泛的模式之一&#xff0c;它確保一個類只有一個實例并提供全局訪問點。本文從歷史背景和核心概念出發&#xff0c;系統闡述了單例模式的產生緣由和演進脈絡&#xff0c;深入剖析了其在資源管理、狀態一致性和訪問控制方…

kafka如何保證消息的順序性

kafka如何保證消息的順序性 Kafka只能在分區&#xff08;Partition&#xff09;級別保證消息的順序性&#xff0c;而不能在主題&#xff08;Topic&#xff09;級別保證全局順序。 核心原理&#xff1a;分區和偏移量分區&#xff08;Partition&#xff09;是順序性的基礎&#x…

傳輸層:UDP/TCP協議

網絡協議圖 一.UDP 特點: 無連接&#xff0c;不可靠&#xff0c;面向數據報&#xff0c;全雙工&#xff08;前面網絡編程中介紹過&#xff09; 格式: 服務器的端口號一般都是程序員指定的(這樣你才能訪問到),客戶端的端口號是系統自動分配的(如果提前指定好, 可能會與其他程…

A/B測試全解析:原理、流程與實戰案例

A/B測試&#xff08;AB Testing&#xff09;原理與實踐全解析 在數據驅動的時代&#xff0c;A/B測試幾乎是每一個互聯網公司都會使用的實驗方法。無論是電商平臺優化轉化率&#xff0c;還是內容平臺提升點擊率&#xff0c;抑或是游戲公司提升留存&#xff0c;A/B測試都是最常見…

循環神經網絡(三):小練習

RNN小練習 要求&#xff1a; 假設有 4 個字 吃 了 沒 &#xff1f;&#xff0c;請使用 torch.nn.RNN 完成以下任務 將每個進行 one-hot 編碼請使用 吃 了 沒 作為輸入序列&#xff0c;了 沒 &#xff1f; 作為輸出序列RNN 的 hidden_size 64請將 RNN 的輸出使用全連接轉換成 4…

ESPIDF官方文檔,啟用dhcp會禁用對應的STA或AP的靜態IP,我測試STA確實是,但是AP不是,為什么

1. STA 模式下的 DHCP&#xff08;客戶端角色&#xff09;ESP32 當 Station&#xff08;STA&#xff09; 時&#xff0c;它的行為就跟你的手機/筆記本連 Wi-Fi 一樣&#xff1a;DHCP 客戶端 → 去路由器&#xff08;DHCP 服務器&#xff09;要一個 IP。特點啟用 DHCP&#xff0…

cocos2d. 3.17.2 c++如何實現下載斷點續傳zip壓縮包帶進度條

新建類CurlDown #include “curl/curl.h” #include using namespace std; USING_NS_CC; /** 資源下載curl */ class CurlDown { public: CurlDown(); ~CurlDown(); void StartDownResZip(string downLoadUrl, int64_t totalSize); //下載控制 void downloadControler(); //下…

MySQL 整型數據類型:選對數字類型,讓存儲效率翻倍

MySQL 整型數據類型&#xff1a;選對數字類型&#xff0c;讓存儲效率翻倍 在 MySQL 中&#xff0c;整型&#xff08;整數類型&#xff09;是最常用的數據類型之一&#xff0c;從用戶 ID 到商品數量&#xff0c;幾乎所有涉及數字的場景都離不開它。但你知道嗎&#xff1f;選對整…

公司電腦監控軟件有哪些?公司電腦監控軟件應該怎么選擇

大家好呀&#xff0c;電競直播運營團隊常常面臨 “直播腳本被抄襲、用戶付費數據篡改、主播話術外泄” 的問題&#xff01;尤其是獨家直播流程腳本、用戶充值記錄、主播互動話術庫、賽事解說手稿&#xff0c;一旦泄露可能導致競品跟風、用戶信任下降、直播競爭力減弱&#xff5…