【算法訓練 day44 分割等和子集】

目錄

  • 一、分割等和子集-LeetCode 416
    • 思路
    • 實現代碼
      • 1.二維dp代碼
      • 2.一維dp代碼
    • 問題
    • 總結



一、分割等和子集-LeetCode 416

Leecode鏈接: leetcode 416
文章鏈接: 代碼隨想錄
視頻鏈接: B站

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

示例1:

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

思路

本體可以看作一個背包模型,將數組總和除2,將總和一半定義為背包的容量,數組元素為可選的物品。本題既可以定義一個一維dp數組,也可以定義一個二維dp數組,但二維便于理解與講解并且一維只是二維的精簡版,思想基本一致,所以主要寫一下二維的思路。數組形式為dp[i][j],i為可選的物品范圍,例如當i為3時,表示可選的物品范圍為0到3下標的物品任意物品;j表示當前背包的容量大小。dp數組含義為,在j容量下,物品0到i范圍可以獲得的最大和。遞推公式為dp[i][j] = dp[i-1][j]或dp[i][j] = max(dp[i-1][j] , dp[i-1][j-nums[i]] + nums[i])。前者表示不放的情況,后者表示物品放入后可能的情況。不放的條件就是背包容量不足以放下物品,放物品的條件就是當前背包的容量大于或等于當前物品的重量。

實現代碼

1.二維dp代碼

//cpp
class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;int len = nums.size();//物品的數量for(int a:nums){sum += a;} if(sum%2 == 1) return false;int target = sum/2;//既是物品的價值也是物品的重量vector<vector<int>>dp(len,vector<int>(target+1,0));for(int j = nums[0];j<=target;j++){dp[0][j] = nums[0];}for(int i = 1;i<len;i++){for(int j = 0;j<=target;j++){if(j<nums[i]){dp[i][j] = dp[i-1][j];}else {dp[i][j] = max(dp[i-1][j],dp[i-1][j - nums[i]]+nums[i]);}}}if(dp[len-1][target] == target) return true;return false;}
};

2.一維dp代碼

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

問題

代碼實現細節不熟練,比如初始化時,怎么將第一行的哪些數初始化為恒定值。

總結

一維與二維的區別在于:省去了多余空間的使用,并且改變了遍歷順序,這是因為如果跟二維數組一樣從前往后遍歷,就會導致重復選擇同一個物品。比如,當i = 1時,dp[1] = 1、dp[2] = 1;當i = 2時,dp[1] = 1、dp[2] = 2,顯然是不對的因為一件物品只能選一次。雖然一維省去了空間,但時間復雜很高,leetcode上一維dp的執行用時為300ms左右,空間占用達到了10MB左右;二維dp為100ms左右,同樣的二維空間占用達到了98MB左右。


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

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

相關文章

SQL入門教程,很詳細

SQL&#xff08;Structured Query Language&#xff09;是一種用于管理關系數據庫的標準語言。它被廣泛用于存儲、操作和檢索數據。在這篇文章中&#xff0c;我們將介紹SQL的基本概念和常用命令。 首先&#xff0c;我們需要了解SQL的基本結構。SQL語句通常由以下幾個部分組成&…

頭歌數據結構與算法課程設計易-算式運算的合法性

給定一個算式運算&#xff0c;算式由運算數、、-、、/、(、)組成&#xff0c;請編寫程序判斷該算式運算是否合法。如果合法&#xff0c;計算該算式的值。 輸入描述&#xff1a; 第一行輸入一個運算表達式 輸出描述&#xff1a; 如果表達式合法則計算其值&#xff0c;結果保留兩…

c語言之向文件讀寫數據塊

c語言需要向文件讀寫數據塊需要用到fread語句和fwrite語句 fread語句的語法格式 fread(butter,size,count,fp) butter&#xff1a;讀取的數據存入內存地址 size:讀取的字節大小 count:讀取數據的個數 fp:讀取的文件指針 fwrite語句語法格式 fwrite(butter,size,count,fp…

企業如何利用社交媒體二維碼做宣傳?提升品牌形象

和普通的二維碼不同&#xff0c;社交媒體二維碼可以通過一個二維碼鏈接企業的超過16的社交媒體渠道鏈接&#xff0c;包括&#xff1a;企業官網、小程序、公眾號、淘寶店鋪、抖音鏈接、小紅書鏈接、美團鏈接、餓了么鏈接…等等。掃描之后&#xff0c;可以在這個社交媒體二維碼界…

校園志愿者|基于SprinBoot+vue的校園志愿者管理系統(源碼+數據庫+文檔)

校園志愿者管理系統 目錄 基于SprinBootvue的校園志愿者管理系統 一、前言 二、系統設計 三、系統功能設計 1 系統功能模塊 2管理員功能 3志愿者功能 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&#xff1a; 博主介紹&a…

采購訂單審批和取消例子

文章目錄 1 Introduction2 Example 1 Introduction This is a exmaple for releaseing po and reseting po. 2 Example DATA:lw_in TYPE zmms015,lw_out TYPE zmms015_out,lt_head LIKE TABLE OF ZMMT003_head,lw_head TYPE ZMMT003_head,lt_item TYPE zmmt003_item_t,lt…

12.RedHat認證-Linux文件系統(下)

12.RedHat認證-Linux文件系統(下) swap虛擬內存 我加一個硬盤做實驗sdc # 創建交換分區&#xff08;不用做成邏輯卷也能靈活分區&#xff09; [rootcentos8 ~]# fdisk /dev/sdc -l Disk /dev/sdc&#xff1a;10 GiB&#xff0c;10737418240 字節&#xff0c;20971520 個扇區 …

REX 521饋線保護繼電器提供 您的高效中壓網絡 保護、測量、監控和基本 控制功能

REX 521饋線保護繼電器提供 您的高效中壓網絡 保護、測量、監控和基本 控制功能。典型的REX 521應用包括輸入和輸出饋線 在隔離中性點中&#xff0c;諧振接地&#xff0c;牢固 接地和電阻接地系統。 …完善ABB繼電器解決方案系列 這種最先進的保護繼電器補充了ABB的一系列解決方…

深入理解linux文件系統與日志分析

深入理解linux文件系統與日志分析 linux文件系統: 文件是存儲在硬盤上的&#xff0c;硬盤上的最小存儲單位是扇區&#xff0c;每個扇區的大小是512字節。 inode&#xff1a;元信息&#xff08;文件的屬性 權限&#xff0c;創建者&#xff0c;創建日期等等&#xff09; block…

【AVL Design Explorer DOE】

AVL Design Explorer DOE 1、關于DOE的個人理解2、DOE參考資料-知乎2.1 DOE發展及基本類型2.2 DOE應用場景2.3 Mintab 中的 DOE工具3、AVL Design Explorer DOE示例 1、關于DOE的個人理解 仿真和試驗一樣&#xff0c;就像盲人摸象&#xff0c;在不知道大象的全景之前&#xff…

Java 垃圾回收

一、概述 GC GC(Garbage Collection)&#xff0c;在程序運行過程中內存空間是有限的&#xff0c;為了更好的的使用有限的內存空間&#xff0c;GC會將不再使用的對象清除然后將其所占用的內存釋放出來。 java的垃圾回收機制 Java的垃圾收集&#xff08;Garbage Collection, …

嵌入式Linux復制剪切刪除指令詳解

指令操作 1. cp 復制指令 a. 用法&#xff1a;cp [ 選項 ] [ 源文件或目錄 ] [ 目標文件或目錄 ]&#xff1b; b. 用途&#xff1a;用于復制文件或目錄&#xff1b; c. 通常情況下&#xff0c;復制的都不是空文件夾&#xff0c;所以直接使用 cp 復制空文件會失敗&#xff0…

創建Django項目及應用

1 創建Project 1個Project可以對應多個app django-admin startproject myproject 2 創建App python manage.py startapp app01 INSTALLED_APPS [# ...app01,app02,# ... ] 如果要讓這個應用在項目中起作用&#xff0c;需要在項目的 settings.py 文件的 INSTALLED_APPS 配置…

java中成員內部類、局部內部類、匿名內部類各自的特點

成員內部類&#xff1a;定義在類的內部&#xff0c;方法的外部&#xff0c;成員內部類作為外部類的成員&#xff0c;可以直接訪問外部類的私有屬性。 局部內部類&#xff1a;定義在方法的內部&#xff0c;對于局部內部類我們常常使用一個方法&#xff0c;得到一個接口實現類的…

臭氧濃度傳感器在食品廠與制藥廠中的應用

在食品廠和制藥廠的生產過程中&#xff0c;消毒是一個至關重要的環節。有效的消毒可以確保產品免受微生物污染&#xff0c;從而保障消費者的健康。近年來&#xff0c;臭氧作為一種廣譜殺菌劑&#xff0c;因其強效的消毒能力和低污染性&#xff0c;在食品廠和制藥廠的消毒過程中…

SpringMVC:創建一個簡單的SpringMVC框架

目錄 一、框架介紹 兩個重要的xml文件 SpringMVC執行流程 二、Vscode搭建SpringMVC框架 1、maven創建webapp原型項目 2、pom.xml下添加springmvc的相關依賴 3、在web.xml配置 4、springmvc.xml的配置 5、編寫Controller控制器類 6、 編寫JSP界面 7、項目結構圖 一…

VS2017中使用qt翻譯家,除ui界面外其他用tr包裹的字符串在翻譯家中顯示為亂碼

1、ui界面中的中文,可以正常顯示 2、其他用tr包裹的字符串,顯示為亂碼 3、解決 改為utf8保存。 然后更新翻譯文件,重新打開發現已經ok了。 參考博客: https://blog.csdn.net/zhou714534957/article/details/124948822 https://blog.csdn.net/weixin_52689816/article/d…

【Linux】期末復習

《Linux程序設計》各章知識點梳理 第1章 軟件包的管理方式方面&#xff0c;Ubuntu、CentOS的差異 Ubantu使用APT&#xff0c;CentOS使用YUM 如何添加一個新用戶&#xff1f; Useradd new_user_name 什么是Shell&#xff1f; Shell 是一個用 C 語言編寫的程序&#xff0c;這個…

Milvus向量數據庫:高效處理海量非結構化數據的利器

一、引言 隨著數據量的爆炸式增長&#xff0c;如何高效地存儲、管理和查詢海量非結構化數據成為數據科學和人工智能領域的一個重大挑戰。傳統的關系型數據庫在處理這種類型的數據時顯得力不從心&#xff0c;而向量數據庫作為一種新型的數據庫解決方案&#xff0c;提供了極大的…

PAT-1004 成績排名(java實現)

這一關感覺還沒第三關難&#xff0c;思路很清晰 題目 1004 成績排名 讀入 n&#xff08;>0&#xff09;名學生的姓名、學號、成績&#xff0c;分別輸出成績最高和成績最低學生的姓名和學號。 輸入格式&#xff1a; 每個測試輸入包含 1 個測試用例&#xff0c;格式為 第 1 行…