Leetcode 102.目標和

給定一個正整數數組 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

思路:

看到數字的范圍,以及狀態狀態是可以從上一層轉移的,所以考慮動態規劃
當然也可以使用dfs(思路會更簡單一些)

狀態表示:
f[i][j]表示前i個數字,總和為k的方案數量
這里每個數字都是必須選的

狀態轉移:
由于每個數字都相當于是必須選的,所以說不存在不選i的情況,所以不能不選i直接從i-1層狀態轉移過來,不選i這一情況的狀態轉移不用考慮了

狀態轉移方程:

                    if(k-nums[i]+m>=0)f[i][k+m]+=f[i-1][k-nums[i]+m];if(k+nums[i]+m<=2*m)f[i][k+m]+=f[i-1][k+nums[i]+m];

注意初始化的時候應該+=1,因為為第一個數為0的時候直接賦值為1會丟失一種情況

代碼:

class Solution {
public:int f[21][2100];int findTargetSumWays(vector<int>& nums, int target) {int n=nums.size();int m=0;for(int i=0;i<n;i++)m+=nums[i];if(m<abs(target))return 0;memset(f,0,sizeof f);//f[i][k]表示第i個數總和為k的方案數//cout<<f[0][m+nums[0]]<<endl;f[0][m+nums[0]]+=1;//cout<<f[0][m+nums[0]]<<endl;f[0][m-nums[0]]+=1;//這里必須是+=1因為nums[0]可能為0,這時候如果=1就少了一種情況//cout<<f[0][m+nums[0]]<<endl;for(int i=1;i<n;i++)for(int k=-m;k<=m;k++)//枚舉總和{//f[i][k+m]=max(f[i-1][k+m],f[i][k+m]); 由于第i個數不能不選,所以說不能不選i,進而從i-1這個狀態直接轉移過來if(k-nums[i]+m>=0)f[i][k+m]+=f[i-1][k-nums[i]+m];if(k+nums[i]+m<=2*m)f[i][k+m]+=f[i-1][k+nums[i]+m];}return f[n-1][m+target];}
};

運行結果:

在這里插入圖片描述

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

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

相關文章

C#面:C#屬性能在接口中聲明嗎?

在C#中&#xff0c;接口是一種定義了一組方法、屬性和事件的類型。在接口中&#xff0c;只能聲明方法、屬性和事件的簽名&#xff0c;而不能包含字段、構造函數或實現代碼。因此&#xff0c;C#屬性不能直接在接口中聲明。 然而&#xff0c;你可以在接口中定義屬性的簽名&#…

VMware的具體使用

&#x1f4d1;打牌 &#xff1a; da pai ge的個人主頁 &#x1f324;?個人專欄 &#xff1a; da pai ge的博客專欄 ??寶劍鋒從磨礪出&#xff0c;梅花香自苦寒來 目錄 一&#x1f324;?VMware的安…

用戶登錄錯誤次數太多鎖定賬號

當用戶登錄驗證碼錯誤次數太多時&#xff0c;需要限制用戶在10分鐘之內不能再次登錄。 限制方案&#xff1a; 1.通過Redis ZSet key可以設置為用戶名&#xff0c;value可以設置為UUID&#xff0c;score設置為當前時間戳 每次用戶登錄時&#xff0c;通過 rangeByScore 查詢對…

Ubuntu22安裝PyCharm

下載&#xff08;社區版&#xff09; 官網下載地址 解壓 sudo tar -xzvf pycharm-community-2024.1.4.tar.gz 軟件移動到指定目錄下&#xff08;根據不同版本修改&#xff09; sudo mv pycharm-community-2024.1.4/ /usr/local/PyCharm/運行 cd /usr/local/PyCharm/pycha…

使用PEFT庫進行ChatGLM3-6B模型的LORA高效微調

PEFT庫進行ChatGLM3-6B模型LORA高效微調 LORA微調ChatGLM3-6B模型安裝相關庫使用ChatGLM3-6B模型GPU顯存占用準備數據集加載模型加載數據集數據處理數據集處理配置LoRA配置訓練超參數開始訓練保存LoRA模型模型推理從新加載合并模型使用微調后的模型 LORA微調ChatGLM3-6B模型 本…

6 序列數據和文本的深度學習

6.1 使用文本數據 文本是常用的序列化數據類型之一。文本數據可以看作是一個字符序列或詞的序列。對大多數問題&#xff0c;我們都將文本看作詞序列。深度學習序列模型(如RNN及其變體)能夠從文本數據中學習重要的模式。這些模式可以解決類似以下領域中的問題&#xff1a; 自然…

JVM專題十一:JVM 中的收集器一

上一篇JVM專題十&#xff1a;JVM中的垃圾回收機制專題中&#xff0c;我們主要介紹了Java的垃圾機制&#xff0c;包括垃圾回收基本概念&#xff0c;重點介紹了垃圾回收機制中自動內存管理與垃圾收集算法。如果說收集算法是內存回收的方法論&#xff0c;那么垃圾收集器就是內存回…

【開發者推薦】告別繁瑣:一鍵解鎖國產ETL新貴,Kettle的終結者

在數字化轉型的今天&#xff0c;數據集成的重要性不言而喻。ETL工具作為數據管理的核心&#xff0c;對企業決策和運營至關重要。盡管Kettle廣受歡迎&#xff0c;但國產ETL工具 TASKCTL 以其創新特性和卓越性能&#xff0c;為市場提供了新的選擇。 TASKCTL概述 TASKCTL 是一款免…

wget之Win11中安裝及使用

wget之Win11中安裝及使用 文章目錄 wget之Win11中安裝及使用1. 下載2. 安裝3. 配置環境變量4. 查看及使用1. 查看版本2. 幫助命令3. 基本使用 1. 下載 下載地址&#xff1a;https://eternallybored.org/misc/wget 選擇對應的版本進行下載即可 2. 安裝 將下載后的wget-1.21.4-w…

中醫實訓室:在傳統針灸教學中的應用與創新

中醫實訓室是中醫教育體系中的重要組成部分&#xff0c;尤其在傳統針灸教學中&#xff0c;它扮演著無可替代的角色。這里是理論與實踐的交匯點&#xff0c;是傳統技藝與現代教育理念的碰撞之地。本文將探討中醫實訓室在傳統針灸教學中的應用與創新實踐。 首先&#xff0c;實訓室…

ResultSet的作用和類型

ResultSet的作用&#xff1a; ResultSet在Java中主要用于處理和操作數據庫查詢結果。它是一個接口&#xff0c;提供了一系列方法來訪問和操作數據庫查詢得到的結果集。具體來說&#xff0c;ResultSet的作用包括&#xff1a; 獲取查詢結果&#xff1a;通過ResultSet可以獲取數…

C++中指針的使用方法

基本概念 指針&#xff1a;一個變量&#xff0c;它存儲另一個變量的內存地址。地址運算符 &&#xff1a;用于獲取變量的內存地址。間接運算符 *&#xff1a;用于訪問指針所指向的變量的值。 聲明和初始化 int a 10; // 定義一個整數變量 int *p &a; // 定…

算法導論 總結索引 | 第四部分 第十六章:貪心算法

1、求解最優化問題的算法 通常需要經過一系列的步驟&#xff0c;在每個步驟都面臨多種選擇。對于許多最優化問題&#xff0c;使用動態規劃算法求最優解有些殺雞用牛刀了&#xff0c;可以使用更簡單、更高效的算法 貪心算法&#xff08;greedy algorithm&#xff09;就是這樣的算…

Git 學習筆記(超詳細注釋,從0到1)

Git學習筆記 1.1 關鍵詞 Fork、pull requests、pull、fetch、push、diff、merge、commit、add、checkout 1.2 原理&#xff08;看圖學習&#xff09; 1.3 Fork別人倉庫到自己倉庫中 記住2個地址 1&#xff09;上游地址&#xff08;upstream地址&#xff09;&#xff1a;http…

Nuxt 應用的三種運行模式(五)

Nuxt.js 提供了三種運行模式&#xff0c;分別是&#xff1a; SPA&#xff08;單頁面應用&#xff09; Universal&#xff08;服務端渲染&#xff09; Static&#xff08;靜態生成&#xff09; 每種模式都適用于不同的場景和需求&#xff0c;下面將詳細解析這三種模式的區別&…

【Qt】Qt多線程編程指南:提升應用性能與用戶體驗

文章目錄 前言1. Qt 多線程概述2. QThread 常用 API3. 使用線程4. 多線的使用場景5. 線程安全問題5.1. 加鎖5.2. QReadWriteLocker、QReadLocker、QWriteLocker 6. 條件變量 與 信號量6.1. 條件變量6.2 信號量 總結 前言 在現代軟件開發中&#xff0c;多線程編程已成為一個不可…

C語言類型轉換理解不同的基本類型為什么能夠進行運算

類型轉換 1.類型轉換1.1隱式轉換1.2常用算術轉換1.2強制類型轉換 1.類型轉換 在執行算數運算時&#xff0c;計算機比C語言的限制更多。為了讓計算機執行算術運算&#xff0c;通常要求操作數用相同的大小&#xff08;即為的數量相同&#xff09;&#xff0c;但是C語言卻允許混合…

Java基礎:常用類(四)

Java基礎&#xff1a;常用類&#xff08;四&#xff09; 文章目錄 Java基礎&#xff1a;常用類&#xff08;四&#xff09;1. String字符串類1.1 簡介1.2 創建方式1.3 構造方法1.4 連接操作符1.5 常用方法 2. StringBuffer和StringBuilder類2.1 StringBuffer類2.1.1 簡介2.1.2 …

智能電能表如何助力智慧農業

智能電能表作為智能電網數據采集的基本設備之一&#xff0c;不僅具備傳統電能表基本用電量的計量功能&#xff0c;還具備雙向多種費率計量功能、用戶端控制功能、多種數據傳輸模式的雙向數據通信功能以及防竊電功能等智能化的功能。這些功能使得智能電能表在農業領域的應用具有…

基于深度學習的圖像去霧

基于深度學習的圖像去霧 圖像去霧是指從有霧的圖像中恢復清晰圖像的過程。傳統的圖像去霧方法&#xff08;如暗原色先驗、圖像分層法等&#xff09;在某些情況下表現良好&#xff0c;但在復雜場景下效果有限。深度學習方法利用大量的數據和強大的模型能力&#xff0c;在圖像去…