代碼隨想錄算法訓練營day43

題目:1049. 最后一塊石頭的重量 II 、494. 目標和、474.一和零

參考鏈接:代碼隨想錄

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

思路:本題石頭是相互粉碎,粉碎后剩下的重量就是兩塊石頭之差,我們可以想到,把石頭分成兩堆總重量分別為A和B,則這兩堆相互粉碎后,剩下的就是這兩堆的重量之差,我們需要使得這個差盡可能小,即把石頭盡可能分為兩部分,使得他們重量差最小。然后和01背包問題對應起來,物品的重量就是石頭的重量stones[i],物品的價值也是石頭的重量stones[i],背包的容量最大為重量和除以2,因為這樣使背包盡可能裝滿,二者的差就會最小。dp五部曲:dp數組,dp[j]表示容量為j的背包能裝的最大重量;遞推公式,和之前一樣,當i能裝進去的時候,dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);dp初始化,首先全部初始化為0,和上題一樣;遍歷順序,對物品從0-i遍歷,但對背包容量需要從大到小遍歷;舉例略。時間復雜度O(mn),m為總重量。

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum=accumulate(stones.begin(),stones.end(),0);int target=sum/2;vector<int> dp(target+1,0);//初始化dp數組for(int i=0;i<stones.size();i++){for(int j=target;j>=0;j--){if(stones[i]<=j){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}}return sum-dp[target]*2;}
};

關鍵在于如何把本題和01背包問題聯系起來。

494. 目標和

思路:本題初看就是回溯法的組合總和,但是會超時。然后想想dp的方法,所有數前面只有+和-兩種情況,我們設+的總和為x,則-的總和為sum-x,最后得到x-(sum-x)=2x-sum=target,故x=(sum+target)/2,我們把x當做背包容量,然后把x裝滿即可,需要求的是把容量為x的背包裝滿用的方法數量,其中weight和value都為nums。對x的計算,考慮取整問題,由于2x=sum+target,故sum和target必須奇偶性相同,如果不同則無解,直接排除,還有target的絕對值不可能大于sum,不然也無解,這兩種情況都需要先排除。然后是方案的計算方法,本題也是一個元素只能放一次,故也是01背包問題,但是求解的東西不一樣,01背包求的是最大價值,這里求的是方法數,故我們的dp數組需要有變化。五部曲:dp數組,dp[j]表示容量為j的背包裝滿的最大方法數;遞推公式,還是和之前的方法思考,如果物品i不能最先放進去,那么就沒有新的方法產生,方法數還是原來的dp[j],如果物品i可以先放進去,那么方法就需要在原有的基礎上增加dp[j-nums[i]],故dp[j]+=dp[j-nums[i]];dp初始化,首先如果全部初始化為0,則遞歸后全部都是0,明顯不符合,對于dp[0],不能初始化為0
只能初始化為1,即背包完全不放,也是一種方法,對其他dp[j],遞推公式都是從dp[0]慢慢累加起來的,我們初始化為1;遍歷順序,和之前相同;舉例,這種不好想的題目,還是得舉例的,nums=[1,1,1,1,1],target=3,x=4,dp初始化為[1,0,0,0,0],當i=0時,dp由遞推公式計算的[1,1,0,0,0],i=1時,[1,2,1,0,0],i=2時,[1,3,3,1,0],i=3時,[1,4,6,4,1],i=4時,[1,5,10,10,5],最終答案為5,符合。時間復雜度O(mn)。

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

本題的幾個重點,首先是根據每個元素放一次想到01背包問題,然后是將正負分開計算得出背包容量,這里類似上題的一分為二,只考慮一部分就是背包容量,最后是dp數組的定義,需要根據題目所求靈活設置。
本題的遞推公式dp[j]+=dp[j-nums[i]]常用于求背包中方法數。

474.一和零

思路:本題初看一點想法都沒有,只想到純暴力方法,把所有子集列出來,再計算0和1的個數。直接看解答,首先要弄明白幾種背包問題的區別。
在這里插入圖片描述
strs里數組的元素就是物品,每個物品只有一個,m和n相當于一個背包,只不過這個背包有兩個維度,即兩個維度都不能超過容量,物品的weight也有兩個維度,分別是0和1的數量,value可以全部認為是1,因為要求集合元素數最大。這里如果按照最初始的01背包問題,需要三維數組,這里我們還是壓縮一維,使用二維數組。五部曲:dp數組,dp[i][j]表示背包中最多物品的數量,其中0的個數不超過i,1的個數不超過j;遞推公式,設物品k中0和1的數量分別為zeroNum和oneNum,則如果物品k能先放進去背包時,dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);初始化,對dp[0][0],物品數量為0,我們可以就全部初始化為0,這個和普通的01背包是一個意思;遍歷順序,從背包容量大到小遍歷;舉例略。時間復雜度O(kmn),k為strs長度。

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1,0));//初始化全為0for(int k=0;k<strs.size();k++){int zeroNum=0,oneNum=0;for(char c:strs[k]){if(c=='0'){zeroNum++;}if(c=='1'){oneNum++;}}for(int i=m;i>=0;i--){for(int j=n;j>=0;j--){if(zeroNum<=i&&oneNum<=j){dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);}}}}return dp[m][n];}
};

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

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

相關文章

使用智譜 GLM-4-9B 和 SiliconCloud 云服務快速構建一個編碼類智能體應用

本篇文章我將介紹使用智譜 AI 最新開源的 GLM-4-9B 模型和 GenAI 云服務 SiliconCloud 快速構建一個 RAG 應用&#xff0c;首先我會詳細介紹下 GLM-4-9B 模型的能力情況和開源限制&#xff0c;以及 SiliconCloud 的使用介紹&#xff0c;最后構建一個編碼類智能體應用作為測試。…

數據結構和算法之數組和鏈表

一、數組 數組是一種線性數據結構&#xff0c;它是由一組連續的內存單元組成的&#xff0c;用于存儲相同類型的數據。在JavaScript中&#xff0c;數組可以包含任意類型的數據&#xff0c;不只限于基本數據類型。 1.存儲方式 在內存中&#xff0c;數組的元素是連續存儲的&…

【Vue】組件的存放目錄問題

注意&#xff1a; .vue文件 本質無區別 組件分類 .vue文件分為2類&#xff0c;都是 .vue文件&#xff08;本質無區別&#xff09; 頁面組件 &#xff08;配置路由規則時使用的組件&#xff09;復用組件&#xff08;多個組件中都使用到的組件&#xff09; 存放目錄 分類開來的…

Llama模型家族之拒絕抽樣(Rejection Sampling)(二)均勻分布簡介

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

ssti模板注入

一、Flask應用 1、介紹 定義 Flask&#xff1a;是一個使用Python編寫的輕量級web應用框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。 特點 良好的文檔、豐富的插件、包含開發服務器和調試器、集成支持單元測試、RESTful請求調度、支持安全cookies、基于Unicode。 …

手機短信刪除怎么恢復?快速找回的3個秘密武器

手機&#xff0c;這個我們每天離不開的小玩意兒&#xff0c;有時候也會讓我們頭疼不已。比如&#xff0c;你一不小心&#xff0c;或者為了清理點空間&#xff0c;就把那些重要的短信給刪了。這些短信可能是你和好友的深夜聊天&#xff0c;或者是重要的工作信息。一旦刪除&#…

人工智能就業方向有哪些?

人工智能就業方向有哪些? 隨著人工智能技術的不斷發展&#xff0c;其應用領域也越來越廣泛。對于想要進入人工智能領域的年輕人來說&#xff0c;選擇一個合適的職業方向是至關重要的。今天給大家介紹六個熱門的人工智能就業方向&#xff0c;分別是機器學習工程師、自然語言處理…

Webshell檢測初識

最近在研究webshell檢測的小東西&#xff0c;所以開啟一個專門記錄webshell檢測工具開發的專欄&#xff0c;若有遺漏之處&#xff0c;請大佬們指出。 本篇大致了解以下內容 什么是webshll&#xff1f;有哪些類型&#xff1f;各自有什么不同&#xff1f;Webshell有哪些常見的檢測…

鼠標側鍵映射虛擬桌面切換 —— Win11

鼠標側鍵映射虛擬桌面切換 —— Win11 基于 AutoHotkey 實現功能 下載軟件 AutoHotkey建議安裝在默認路徑下&#xff08;C盤&#xff09; 此軟件非常小&#xff0c;幾乎不占用資源軟件安裝在默認路徑以外的位置可能導致部分功能不可用 新建一個 .ahk 文件使用記事本打開該 .a…

哪款開放式耳機佩戴最舒服?2024五款備受推崇產品分享!

?在現今耳機市場&#xff0c;開放式耳機憑借其舒適的佩戴體驗和獨特的不入耳設計&#xff0c;備受消費者追捧。它們不僅讓你在享受音樂時&#xff0c;仍能察覺周圍的聲音&#xff0c;確保與人交流無障礙&#xff0c;而且有利于耳朵的衛生與健康。對于運動愛好者和耳機發燒友而…

GIGE 協議摘錄 —— 引導寄存器(四)

系列文章目錄 GIGE 學習筆記 GIGE 協議摘錄 —— 設備發現&#xff08;一&#xff09; GIGE 協議摘錄 —— GVCP 協議&#xff08;二&#xff09; GIGE 協議摘錄 —— GVSP 協議&#xff08;三&#xff09; GIGE 協議摘錄 —— 引導寄存器&#xff08;四&#xff09; GIGE 協議…

Flutter Dismissible 屬性介紹及使用指南

在移動應用開發中&#xff0c;滑動刪除是一種常見的交互方式。Flutter 提供了一個強大的小部件 Dismissible&#xff0c;使得實現這一功能變得非常簡單。本文將介紹 Dismissible 的主要屬性及其使用方法。 1. Dismissible 簡介 Dismissible 是一個 Flutter 小部件&#xff0c…

前后端實現文件上傳進度條-實時進度

后端接口代碼&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 獲取文件名String fileName file.getOriginalFilename();// 創建上傳目標路徑Path targetPa…

基于簡單Agent對醫療數據進行分析

數據表 供應商資格審核規定.pdf 醫生名錄.xlsx 歷史就診記錄.xlsx 患者信息名錄.xlsx 藥品.xlsx 藥品庫存管理.xlsx 采購單位基本信息.xlsx Agent測試 模型基于ChatGPT-3.5 問題&#xff1a;幫我找出不達標的供應商 Agent分析過程 [Thought: 0] Key Concepts: - 不達標的供…

P7 品牌管理

逆向生成頁面 新增菜單—商品系統的品牌管理 —product/brand 在代碼生成器得到的文件中&#xff0c; main-resources-src-views-modules-product brand.vue、brand-add-or-update.vue放到category.vue同級vue文件有新增、刪除按鈕&#xff0c;但頁面未顯示&#xff0c;是因…

嵌入式Linux系統中RTC應用的操作詳解

第一:RTC的作用以及時間簡介 “RTC”的英文全稱是Reul-Time Clock,翻譯過來是實時時鐘芯片.實時時鐘芯片是日常生活中應用最為廣泛的電子器件之一,它為人們或者電子系統提供精確的實時時間,實時時鐘芯片通過引腳對外提供時間讀寫接口,通常內部帶有電池,保證在外部系統關…

【Android】使用EventBus進行線程間通訊

EventBus 簡介 EventBus&#xff1a;github EventBus是Android和Java的發布/訂閱事件總線。 簡化組件之間的通信 解耦事件發送者和接收者 在 Activities, Fragments, background threads中表現良好 避免復雜且容易出錯的依賴關系和生命周期問題 Publisher使用post發出…

好書推薦-人工智能數學基礎

本書以零基礎講解為宗旨&#xff0c;面向學習數據科學與人工智能的讀者&#xff0c;通俗地講解每一個知識點&#xff0c;旨在幫助讀者快速打下數學基礎。    全書分為 4 篇&#xff0c;共 17 章。其中第 1 篇為數學知識基礎篇&#xff0c;主要講述了高等數學基礎、微積分、泰…

鴻蒙Ability Kit(程序框架服務)【應用啟動框架AppStartup】

應用啟動框架AppStartup 概述 AppStartup提供了一種更加簡單高效的初始化組件的方式&#xff0c;支持異步初始化組件加速應用的啟動時間。使用啟動框架應用開發者只需要分別為待初始化的組件實現AppStartup提供的[StartupTask]接口&#xff0c;并在[startup_config]中配置App…

Open vSwitch 數據包處理流程

一、Open vSwitch 數據包轉發模式 Open vSwitch 根據不同的模塊使用&#xff0c;主要分為兩種數據包的轉發模式&#xff1a;Datapath 模式和 DPDK 模式&#xff0c;這兩種模式的主要區別在于&#xff1a; Datapath 模式&#xff1a; 使用內核空間的網絡棧進行數據包的轉發性能相…