LeetCode 熱題 100_零錢兌換(85_322_中等_C++)(動態規劃)

LeetCode 熱題 100_零錢兌換(85_322)

    • 題目描述:
    • 輸入輸出樣例:
    • 題解:
      • 解題思路:
        • 思路一(動態規劃):
      • 代碼實現
        • 代碼實現(思路一(動態規劃)):
        • 以思路一為例進行調試

題目描述:

給你一個整數數組 coins ,表示不同面額的硬幣;以及一個整數 amount ,表示總金額。

計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額,返回 -1 。

你可以認為每種硬幣的數量是無限的。

輸入輸出樣例:

示例 1:
輸入:coins = [1, 2, 5], amount = 11
輸出:3
解釋:11 = 5 + 5 + 1

示例 2:
輸入:coins = [2], amount = 3
輸出:-1

示例 3:
輸入:coins = [1], amount = 0
輸出:0

提示:
1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104

題解:

解題思路:

思路一(動態規劃):

1、通過題目的描述需解決湊成總金額所需的最少的硬幣個數,且硬幣可以重復使用,這樣自然而然將問題轉換為了完全背包問題(金幣的數量為物品的個數,金額為物品的價值)。

2、具體思路如下:
① dp[j],dp數組的含義為:放滿j容量的背包,最少的物品數量。
② dp[j]=min(dp[j],dp[j-nums[i]]+1) ,等號右側 dp[ j ]代表不放物品 i , dp[j-nums[i]]+1 代表放物品 j 。
③ dp[0]=0,因容量為 0 的背包可以放 0 件物品
④ 因取最小值,其他的dp數組的元素值為INT_MAX,數以這里需考慮溢出的情況dp[j-nums[i]]若為INT_MAX再加一則會溢出
⑤ 因可重復使用同一金額的硬幣則遍歷順序為從左到右。

3、復雜度分析:
① 時間復雜度:O(Sn),其中 S 是金額,n 是面額數(物品的價值)。我們一共需要計算 O(S) 個狀態,S 為題目所給的總金額(背包容量)。雙重循環遍歷 物品 和 背包。

② 空間復雜度:O(S)。dp 所需的空間 。

代碼實現

代碼實現(思路一(動態規劃)):

class Solution{
public:// 定義 coinChange 函數,參數為硬幣面值數組 coins 和目標金額 amountint coinChange(vector<int> &coins, int amount){// 初始化 dp 數組,大小為 amount + 1(從 0 到 amount),并將所有元素初始化為 INT_MAX// dp[i] 表示湊成金額 i 所需要的最少硬幣數量vector<int> dp(amount + 1, INT_MAX);// dp[0] = 0,因為湊成金額 0 不需要任何硬幣dp[0] = 0;// 外層循環遍歷每種硬幣(物品)for (int i = 0; i < coins.size(); i++){// 內層循環遍歷從當前硬幣面值到目標金額之間的所有金額(背包)for (int j = coins[i]; j <= amount; j++){// 防止數據溢出:只有當 dp[j - coins[i]] 不等于 INT_MAX 時,才進行更新// 這是因為如果 dp[j - coins[i]] 為 INT_MAX,表示無法湊成金額 j - coins[i]if (dp[j - coins[i]] != INT_MAX) {// 更新 dp[j]:表示使用當前硬幣后,湊成金額 j 的最小硬幣數dp[j] = min(dp[j], dp[j - coins[i]] + 1);}}}// 如果 dp[amount] 還是 INT_MAX,表示無法湊成目標金額,返回 -1// 否則返回 dp[amount],即湊成目標金額所需要的最少硬幣數量return dp[amount] == INT_MAX ? -1 : dp[amount];}
};
以思路一為例進行調試
#include<iostream>
#include<vector>
using namespace std;class Solution{
public:// 定義 coinChange 函數,參數為硬幣面值數組 coins 和目標金額 amountint coinChange(vector<int> &coins, int amount){// 初始化 dp 數組,大小為 amount + 1(從 0 到 amount),并將所有元素初始化為 INT_MAX// dp[i] 表示湊成金額 i 所需要的最少硬幣數量vector<int> dp(amount + 1, INT_MAX);// dp[0] = 0,因為湊成金額 0 不需要任何硬幣dp[0] = 0;// 外層循環遍歷每種硬幣(物品)for (int i = 0; i < coins.size(); i++){// 內層循環遍歷從當前硬幣面值到目標金額之間的所有金額(背包)for (int j = coins[i]; j <= amount; j++){// 防止數據溢出:只有當 dp[j - coins[i]] 不等于 INT_MAX 時,才進行更新// 這是因為如果 dp[j - coins[i]] 為 INT_MAX,表示無法湊成金額 j - coins[i]if (dp[j - coins[i]] != INT_MAX) {// 更新 dp[j]:表示使用當前硬幣后,湊成金額 j 的最小硬幣數dp[j] = min(dp[j], dp[j - coins[i]] + 1);}}}// 如果 dp[amount] 還是 INT_MAX,表示無法湊成目標金額,返回 -1// 否則返回 dp[amount],即湊成目標金額所需要的最少硬幣數量return dp[amount] == INT_MAX ? -1 : dp[amount];}
};int main(int argc, char const *argv[])
{// 給定硬幣面值數組和目標金額vector<int> coins = {1, 2, 5};int amount = 11;// 創建 Solution 對象Solution s;// 調用 coinChange 函數并輸出結果cout << s.coinChange(coins, amount);return 0;
}

LeetCode 熱題 100_零錢兌換(85_322)原題鏈接
歡迎大家和我溝通交流(????)

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

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

相關文章

游戲盾IP可以被破解嗎

游戲盾IP&#xff08;如上海云盾SDK、騰訊云游戲盾&#xff09;是專為游戲行業設計的高防服務&#xff0c;旨在抵御DDoS攻擊、CC攻擊等威脅。其安全性取決于??技術架構、防護能力??以及??運維策略??。雖然理論上沒有絕對“無法破解”的系統&#xff0c;但游戲盾IP在合理…

SpringBoot實戰1

SpringBoot實戰1 一、開發環境&#xff0c;環境搭建-----創建項目 通過傳統的Maven工程進行創建SpringBoot項目 &#xff08;1&#xff09;導入SpringBoot項目開發所需要的依賴 一個父依賴&#xff1a;&#xff08;工件ID為&#xff1a;spring-boot-starter-parent&#xf…

【軟考-高級】【信息系統項目管理師】【論文基礎】進度管理過程輸入輸出及工具技術的使用方法

定義 項目進度管理是為了保證項目按時完成&#xff0c;對項目中所需的各個過程進行管理的過程&#xff0c;包括規劃進度、定義活動、活動優先級排序、活動持續時間、制定進度計劃和控制進度。 管理基礎 制定進度計劃的一般步驟 選擇進度計劃方法&#xff08;如關鍵路徑法&a…

【Linux】之【Get】 chroot 環境下安裝deb包時 .postinst:行 9: 201 段錯誤 (核心已轉儲)ldconfig

背景 如題&#xff0c;在postinst文件中直接執行了ldconfig命令&#xff0c; chroot 環境下出錯&#xff0c;安裝失敗 分析 chroot 環境下不能用 ldconfig 和 systemctl 但是&#xff1a;如果環境是 chroot&#xff0c;系統有可能沒完整掛載 /proc、/dev、系統路徑&#xff…

【論文精讀與實現】EDC2-RAG:基于動態聚類的文檔壓縮方法提升檢索增強生成RAG性能

?? 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net ?? 歡迎點擊加入AI人工智能社區! ?? 讓我們一起努力,共創AI未來! ?? 1. 論文核心思想 這篇由清華大學團隊提出的EDC-RAG框架,針對當前…

OSPF接口的網絡類型和不規則區域

網絡類型(數據鏈路層所使用的協議所構建的二層網絡類型) 1、MA --- 多點接入網絡 BMA --- 支持廣播的多點接入網絡 NBMA --- 不支持廣播的多點接入網絡 2、P2P --- 點到點網絡 以太網 --- 以太網最主要的特點是需要基于MAC地址進行物理尋址&#xff0c;主要是因為以太網接口所連…

HTTP代理:內容分發戰場上的「隱形指揮官」

目錄 一、技術本質&#xff1a;流量博弈中的「規則改寫者」 二、戰略價值&#xff1a;內容分發的「四維升級」 三、實戰案例&#xff1a;代理技術的「降維打擊」 四、未來進化&#xff1a;代理技術的「認知升級」 五、結語&#xff1a;代理技術的「戰略覺醒」 在數字內容爆…

(2)網絡學習之堡壘機

堡壘機和防火墻的區別&#xff1a; 1.功能定位 防火墻主要負責抵御外部攻擊&#xff0c;就像一道堅固的城墻&#xff0c;防止黑客進入內部網絡。堡壘機則專注于內部管理&#xff0c;監控和記錄運維人員的操作行為&#xff0c;確保內部網絡的安全。 2.部署位置與作用范圍 防…

minio命令行客戶端mc常見用法

安裝minio命令行客戶端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安裝minio命令行客戶端 choco install minio-client -y# Linux安裝mc客戶端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 賦予可…

idea調整控制臺日志顯示長度

概述 在調試時&#xff0c;idea控制臺顯示的日志有長度顯示&#xff0c;當顯示的日志太長時&#xff0c;后生成的日志會覆蓋掉之前生成的日志內容。想要調整長度就可以按以下方式進行設置。 設置方法 Settings -> Editor -> General -> Console -> Override con…

oracle em修復之路

很早以前寫的文章&#xff0c;再草稿中存放太久了&#xff0c;今天開始整理20年來工作體會&#xff0c;以后陸續發出&#xff0c;希望給大家提供小小的幫助。 去年做的項目使用的oracle數據庫&#xff0c;最近要看一下&#xff0c;啟動機器進入系統&#xff0c;出現無法加載數…

QT中怎么隱藏或顯示最大化、最小化、關閉按鈕

文章目錄 方法一&#xff1a;通過代碼動態設置1、隱藏最大化按鈕2、隱藏最小化按鈕3、隱藏關閉按鈕方法 1&#xff1a;移除 WindowCloseButtonHint方法 2&#xff1a;使用 Qt::CustomizeWindowHint 并手動控制按鈕 4、同時隱藏最大化和最小化按鈕5、同時隱藏最大化和關閉按鈕6、…

性能比拼: Redis vs Memcached

本內容是對知名性能評測博主 Anton Putra Redis vs Memcached Performance Benchmark 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準 在本視頻中&#xff0c;我們將對比 Redis 和 Memcached。我會介紹一些功能上的不同&#xff0c;但主要關注 性能。 首先&#xf…

P1331 洛谷 海戰

題目描述 思路 這個題需要讀懂題意&#xff0c;即“什么樣的形式表示兩只船相撞&#xff1f;” ----> 上下相鄰或左右相鄰 如果圖是不和法的&#xff0c;一定存在如下結構&#xff1a; # # . # 或 # # # . 或 # . # # 或 . # # #即四個格子里有三個#&#xff0c;一個"…

傳統項目純前端實現導出excel之xlsx.bundle.js

傳統項目純前端實現導出excel之xlsx.js 自從vue問世后&#xff0c;使得前端開發更加簡潔從容&#xff0c;極大的豐富組件樣式和頁面渲染效果&#xff0c;使得前端功能的可擴展性得到極大地加強。雖然vue的使用對于前后端分離的項目對于功能實現與擴展有了質的飛躍&#xff0c;但…

2025.04.10-拼多多春招筆試第四題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 04. 優惠券最優分配問題 問題描述 LYA是一家電商平臺的運營經理,負責促銷活動的策劃。現在平臺上有 n n n

基于 Spring Boot 瑞吉外賣系統開發(三)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;三&#xff09; 分類列表 靜態頁面 實現功能所需要的接口 定義Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定義Service接口 public interface CategoryService extends ISe…

FlinkSQL的常用語言

FlinkSQL 常用語言指南 FlinkSQL 是 Apache Flink 提供的 SQL 接口&#xff0c;允許用戶使用標準 SQL 或擴展的 SQL 語法來處理流式和批式數據。以下是 FlinkSQL 的常用語言元素和操作&#xff1a; 基本查詢 -- 選擇查詢 SELECT * FROM table_name;-- 帶條件的查詢 SELECT c…

spring mvc異步請求 sse 大文件下載 斷點續傳下載Range

學習連接 異步Servlet3.0 Spring Boot 處理異步請求&#xff08;DeferredResult 基礎案例、DeferredResult 超時案例、DeferredResult 擴展案例、DeferredResult 方法匯總&#xff09; spring.io mvc Asynchronous Requests 官網文檔 spring.io webflux&webclient官網文…

一問看懂——支持向量機SVM(Support Vector Machine)

目錄 蕪湖~~~支持向量機&#xff08;SVM&#xff09; 1. 引言 2. 基本思想 3. 數學模型 3.1 超平面定義 3.2 分類間隔與目標函數 3.3 軟間隔與松弛變量 4. 核函數方法&#xff08;Kernel Trick&#xff09; 4.1 核函數定義 4.2 常用核函數 5. SVM 的幾種類型 6. SV…