leetcode day 35 01背包問題 416+1049

0-1背包問題

(1)第一種情況:二維dp[i][j]數組

dp[i][j]表示[0,i]的物品放入容量為j背包的最大價值

不放物品i,dp[i][j]=dp[i-1][j]

放物品i,dp[i][j]=dp[i-1][j-w[i]]+v[i]

遞推公式為:

?dp[i][j]=dp[i-1][j];//不放

?if(w[i]<=j)dp[i][j]=max(dp[i][j],dp[i-1][j-w[i]]+v[i]);

? //當前物品體積小于j才可以放

兩層for循環,先遍歷物品或者先變量背包容量都可以

(2)第二種情況:一維dp[j]數組...相當于上一層數組拷貝下來,也叫滾動數組

dp[j]表示容量為j的背包所能放的最大價值

不放物品i,dp[j]=dp[j]

放物品i,dp[j]=dp[j-w[i]]+v[i]

遞推公式為:

dp[j]=max(dp[j],dp[j-w[i]]+v[i])

雙重for循環,必須先遍歷物品,再遍歷背包,同時背包要倒序遍歷。

for(int i=0;i<n;i++){

? ? ? ? for(int j=t;j>=nums[i];j--){

? ? ? ? ? ? dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);

? ? ? ? }

? ? }

原因:保證每個物品只添加一次

416 分割等和子集

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

1 <= nums.length <= 200

1 <= nums[i] <= 100

示例 1:

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

示例 2:

輸入:nums = [1,2,3,5]
輸出:false
解釋:數組不能分割成兩個元素和相等的子集。
  • 背包的體積為sum / 2
  • 背包要放入的商品(集合里的元素)重量為 元素的數值,價值也為元素的數值
  • 背包如何正好裝滿,說明找到了總和為 sum / 2 的子集。
  • 背包中每一個元素是不可重復放入。

0-1背包問題,相當于物品體積和價值都是nums[i]

對數組求和,sum為奇數一定不滿足

求出容量為sum/2時能放入的最大價值,如果剛好放慢,則說明可以分割為等和子集。

根據數組長度和大小,可以確定dp數組的大小,100*200/2=10000

int max(int a,int b){return a>b?a:b;
}
/*0-1背包問題,相當于物品體積和價值都是nums[i]
對數組求和,sum為奇數一定不滿足
求出容量為sum/2時能放入的最大價值,如果剛好放慢,則說明可以分割為等和子集
*/
bool canPartition(int* nums, int numsSize) {int sum=0,i,j;int dp[10005]={};//dp[j]表示背包體積為j能放入的最大體積for(i=0;i<numsSize;i++){sum+=nums[i];}if(sum%2!=0)return false;//數組和必為偶數else{for(i=0;i<numsSize;i++){//必須先遍歷物品for(j=sum/2;j>=nums[i];j--){//倒序遍歷,保證每個元素只添加一次dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);//放入物品i,dp[j-nums[i]]+nums[i}}}if(dp[sum/2]==sum/2)return true;else return false;
}

1049 最后一塊石頭的重量

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

每一回合,從中選出任意兩塊石頭,然后將它們一起粉碎。假設石頭的重量分別為?x?和?y,且?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

盡量把石頭分為重量相近的兩堆,保證相撞后重量最小

所以要盡可能分成重量為 sum / 2 的石頭堆,這樣剩下的石頭堆也是 盡可能接近 sum/2 的重量

轉化為背包問題,容量為sum/2時能裝入的最大重量

剩下重量為sum-dp[sum/2],sum/2向下取整,所以剩下的重量一定大于dp[sum/2]

最后返回剩下重量與dp[sum/2]的差即可

int max(int a,int b){return a>b?a:b;
}
/*
盡量把石頭分為重量相近的兩堆,保證相撞后重量最小
所以要盡可能分成重量為 sum / 2 的石頭堆,這樣剩下的石頭堆也是 盡可能接近 sum/2 的重量
轉化為背包問題,容量為sum/2時能裝入的最大重量
剩下重量為sum-dp[sum/2],sum/2向下取整,所以剩下的重量一定大于dp[sum/2]
最后返回剩下重量與dp[sum/2]的差即可
*/
int lastStoneWeightII(int* stones, int stonesSize) {int dp[15005]={};//dp[j]表示背包容量為j時所能放的最大價值int sum=0;for(int i=0;i<stonesSize;i++){sum+=stones[i];}int t=sum/2;for(int i=0;i<stonesSize;i++){for(int j=t;j>=stones[i];j--){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}//sum向下取整,所以sum-dp[t]一定大于dp[t]return sum-dp[t]-dp[t];
}

總結:01背包問題,物品數量只有一個時,分為選和不選兩種情況討論

做題步驟

1、確定dp數組含義

2、確定遞推公式

3、初始化

4、遍歷。注意,二維dp數組遍歷無順序要求,一維dp數組必須先遍歷物品,再遍歷背包,并且背包要倒序遍歷。循環內j>w[i]

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

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

相關文章

算法時代的“摩西十誡”:AI治理平臺重構數字戒律

一、引言 數字時代的狂飆突進中&#xff0c;人工智能&#xff08;AI&#xff09;正以顛覆性的力量重塑人類社會。從醫療診斷到金融決策&#xff0c;從智能制造到輿論傳播&#xff0c;AI的觸角已延伸至每個角落。 然而&#xff0c;斯坦福大學《2024年人工智能指數報告》揭示的…

上岸率85%+,25西電先進材料與納米科技學院(考研錄取情況)

1、先進材料與納米科技學院各個方向 2、先進材料與納米科技學院近三年復試分數線對比 學長、學姐分析 由表可看出&#xff1a; 1、材料科學與工程25年相較于24年上升10分&#xff0c;為290分 2、材料與化工&#xff08;專碩&#xff09;25年相較于24年下降20分&#xff0c;為…

Tomcat Web應用(Ubuntu 18.04.6 LTS)部署筆記

一、前言 本文與【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】和【JDK&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】同批次&#xff1a;先搭建數據庫&#xff0c;再安裝JVM&#xff0c;后面就是部署Web應用&#xff1a;典型的單機部署。 ??本著善…

Datawhale AI春訓營——用AI幫助老人點餐

詳細內容見官網鏈接&#xff1a;用AI幫助老人點餐-活動詳情 | Datawhale

17.第二階段x64游戲實戰-人工遍歷二叉樹結構

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;16.第二階段x64游戲實戰-分析二叉樹結構 上一個內容里把二叉樹的結構寫了寫&am…

Oracle 11g RAC ASM磁盤組剔盤、加盤實施過程

環境&#xff1a;AIX6.1 Oracle RAC 11.2.0.3 前期準備&#xff1a; 1.查看DG磁盤組空間情況&#xff1a; –查看DG磁盤組空間情況&#xff1a; ASMCMD> lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Of…

Java—— 正則表達式 方法及捕獲分組

識別正則表達式的方法 方法名說明public String[] matches(String regex) 判斷字符串是否滿足 正則表達式的規則 public string replaceAll(String regex,string newstr) 按照正則表達式的 規則進行替換 public string[] split(String regex) 按照正則表達式的 規則切割字符串…

達夢并行收集統計信息

達夢收集統計信息速度如何&#xff1f; 答&#xff1a;1分鐘1G 大庫收集起來可能比較慢&#xff0c;想并行收集需要一些條件 3個參數先了解一下 我把max_parallel_degree改為16 相關說明可以看一下 對一個3G的表收集 收集方法 DBMS_STATS.GATHER_TABLE_STATS( TEST,T1,…

PyTorch 實戰:Transformer 模型搭建全解析

Transformer 作為一種強大的序列到序列模型&#xff0c;憑借自注意力機制在諸多領域大放異彩。它能并行處理序列&#xff0c;有效捕捉上下文關系&#xff0c;其架構包含編碼器與解碼器&#xff0c;各由多層組件構成&#xff0c;涉及自注意力、前饋神經網絡、歸一化和 Dropout 等…

網頁不同渲染方式的應對與反爬機制的處理——python爬蟲

文章目錄 寫在前面爬蟲習慣web 網頁渲染方式服務器渲染客戶端渲染 反爬機制使用session對象使用cookie讓請求頭信息更豐富使用代理和隨機延遲 寫在前面 本文是對前兩篇文章所介紹的內容的補充&#xff0c;在了解前兩篇文章——《爬蟲入門與requests庫的使用》和《BeautifulSou…

RK3588平臺用v4l工具調試USB攝像頭實踐(亮度,飽和度,對比度,色相等)

目錄 前言:v4l-utils簡介 一&#xff1a;查找當前的攝像頭設備 二&#xff1a;查看當前攝像頭支持的v4l2-ctl調試參數 三根據提示設置對應參數&#xff0c;在提示范圍內設置 四&#xff1a;常用調試命令 五:應用內執行命令方法 前言:v4l-utils簡介 v4l-utils工具是由Linu…

Spring Security基礎入門

本入門案例主要演示Spring Security在Spring Boot中的安全管理效果。為了更好地使用Spring Boot整合實現Spring Security安全管理功能&#xff0c;體現案例中Authentication&#xff08;認證&#xff09;和Authorization&#xff08;授權&#xff09;功能的實現&#xff0c;本案…

Trae+DeepSeek學習Python開發MVC框架程序筆記(二):使用4個文件實現MVC框架

修改上節文件&#xff0c;將test2.py拆分為4個文件&#xff0c;目錄結構如下&#xff1a; mvctest/ │── model.py # 數據模型 │── view.py # 視圖界面 │── controller.py # 控制器 │── main.py # 程序入口其中model.py代碼如下&#xff…

從認證到透傳:用 Nginx 為 EasySearch 構建一體化認證網關

在構建本地或云端搜索引擎系統時&#xff0c;EasySearch 憑借其輕量、高性能、易部署等優勢&#xff0c;逐漸成為眾多開發者和技術愛好者的首選。但在實際部署過程中&#xff0c;如何借助 Nginx 為 EasySearch 提供高效、穩定且安全的訪問入口&#xff0c;尤其是在身份認證方面…

CPU 虛擬化機制——受限直接執行 (LDE)

1. 引言&#xff1a;CPU虛擬化的核心問題 讓多個進程看似同時運行在一個物理CPU上。核心思想是時分共享 (time sharing) CPU。為了實現高效且可控的時分共享&#xff0c;本章介紹了一種關鍵機制&#xff0c;稱為受限直接執行 (Limited Direct Execution, LDE)。 1.1 LDE的基本…

linux 中斷子系統鏈式中斷編程

直接貼代碼了&#xff1a; 虛擬中斷控制器代碼&#xff0c;chained_virt.c #include<linux/kernel.h> #include<linux/module.h> #include<linux/clk.h> #include<linux/err.h> #include<linux/init.h> #include<linux/interrupt.h> #inc…

容器修仙傳 我的靈根是Pod 第10章 心魔大劫(RBAC與SecurityContext)

第四卷&#xff1a;飛升之劫化神篇 第10章 心魔大劫&#xff08;RBAC與SecurityContext&#xff09; 血月當空&#xff0c;林衍的混沌靈根正在異變。 每道經脈都爬滿黑色紋路&#xff0c;神識海中回蕩著蠱惑之音&#xff1a;"破開藏經閣第九層禁制…奪取《太古弒仙訣》……

基于c#,wpf,ef框架,sql server數據庫,音樂播放器

詳細視頻: 【基于c#,wpf,ef框架,sql server數據庫&#xff0c;音樂播放器。-嗶哩嗶哩】 https://b23.tv/ZqmOKJ5

精益數據分析(21/126):剖析創業增長引擎與精益畫布指標

精益數據分析&#xff08;21/126&#xff09;&#xff1a;剖析創業增長引擎與精益畫布指標 大家好&#xff01;在創業和數據分析的探索道路上&#xff0c;我一直希望能和大家攜手共進&#xff0c;共同學習。今天&#xff0c;我們繼續深入研讀《精益數據分析》&#xff0c;剖析…

Spark-streaming核心編程

1.導入依賴?&#xff1a; <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>3.0.0</version> </dependency> 2.編寫代碼?&#xff1a; 創建Sp…