leetcode 322. 零錢兌換 思考分析

目錄

    • 1、題目
    • 2、思路分析
    • 3、參考鏈接

1、題目

給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

你可以認為每種硬幣的數量是無限的。
在這里插入圖片描述

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

2、思路分析

這一題和leetcode 39. 組合總和 思考分析有點像,不過要求不同。
39題要求的是所有解的集合,而這一題求的是最優解。
所以直接套用39回溯思路,然后從子解中找到最小的即可,貌似也是能做的,不過會超時。。。

class Solution {
public:int left_sum;int min_coin_nums;int coin_nums;void backtracking(vector<int>& coins,int startindex){   if(left_sum < 0) return;if(left_sum == 0){if(min_coin_nums==0) min_coin_nums=coin_nums;else min_coin_nums=min(min_coin_nums,coin_nums);return;}for(int i=startindex;i<coins.size();i++){if(left_sum-coins[i]<0) break;//處理結點;coin_nums++;left_sum-=coins[i];//遞歸,探索下一層backtracking(coins,i);		//遞歸//回溯,撤銷處理結果left_sum+=coins[i];coin_nums--;}}int coinChange(vector<int>& coins, int amount) {min_coin_nums=0;coin_nums=0;left_sum=amount;//排序加速剪枝sort(coins.begin(),coins.end());backtracking(coins,0);if((min_coin_nums ==0 && amount == 0)||(min_coin_nums != 0)) return min_coin_nums;return -1;}
};

其實這一題是一道動態規劃題:
如果想求amount = 11時的最少硬幣數(原問題),如果知道amout =10的最少硬幣數(子問題),你只需要把子問題的答案加一(再選一枚1元的硬幣),因為硬幣的數量是沒有限制的,當然也可能是amout =6的最少硬幣數加上一個面額為5的硬幣。這時候就需要取最少的硬幣數了。
子問題之間是相互獨立的。
1、分析最優子結構:
湊成面值為 11 的最少硬幣個數可以由以下三者的最小值得到:

湊成面值為 10 的最少硬幣個數 + 面值為 1 的這一枚硬幣;
湊成面值為 9 的最少硬幣個數 + 面值為 2 的這一枚硬幣;
湊成面值為 6 的最少硬幣個數 + 面值為 5 的這一枚硬幣。
dp[11] = min (dp[10] + 1, dp[9] + 1, dp[6] + 1)

2、確定【DP狀態】
dp[i] :湊齊總價值 i 需要的最少硬幣個數;
3、確定狀態轉移方程

for(int i = 0;i < coins.size();i++)
{if (coin[i] <= amount)dp[amount] = min(1 + dp[amount - coin[i]])  }

在這里插入圖片描述
需要注意的地方:
單枚硬幣的面值首先要小于等于 當前要湊出來的面值。

class Solution {
public:int coinChange(vector<int>& coins, int amount) {int n = coins.size();//對dp數組中每個值先賦一個不可能的值,因為要比較的是最小值,這個不可能的值就得賦值成為一個最大值,這里只需要比總金額大就行了,表示湊不出來//dp[i] :湊齊總價值 i 需要的最少硬幣個數;vector<int> dp(amount + 1,amount+1);//湊總金額為0,不需要硬幣dp[0] = 0;//從0到amount,計算湊齊總價值 i 需要的最少硬幣個數;for(int i = 0;i <=amount;i++){//從0到coins.size(),遍歷每個面額的硬幣for(int j = 0;j < n;j++){//總價值必須比該硬幣面額大//并且dp[i - coins[j]]必須被賦過值,也就是說必須有個方案,要能夠湊出來,這樣才能進行下一步推導if(i - coins[j] >= 0 && dp[i - coins[j]] != amount+1){//如果滿足這個條件,那么dp[i]就是dp[i]和當前方案中的最小值,因為dp[i]可能被多次賦值,我們取的是最優值dp[i] = min(dp[i],1 + dp[i - coins[j]]);}}}//dp[amount]沒有沒賦值,說明沒有組合方案,所以應該返回-1if(dp[amount] == amount+1){return -1;}return dp[amount];}};

時間復雜度:O(N \times amount)O(N×amount),這里 NN 是可選硬幣的種類數,amountamount 是題目輸入的面值;
空間復雜度:O(amount)O(amount),狀態數組的大小為 amountamount。
由于dp數組是自底向上求解的,所以過程中不會出現重疊子問題
需要注意的地方:

1、數組初始化把初值amount+1換成Integer.MAX_VALUE為什么就不行了 ?
如果初值賦值為正無窮,dp[i - coin] +1 可能會發生整型溢出。
2、循環的判斷條件if (i - coin >= 0 && dp[i - coin] != amount + 1)為什么要判斷 dp[i - coin] != amount + 1呢
amount + 1 在這里表示的是當前狀態表示的金額不能被候選硬幣的和表示。
去掉dp[i-coin] != amount + 1 這個判斷條件也是可以的, 因為若是 dp[i-coin] = amount + 1, 在下一步 dp[i] = Math.min(dp[i], 1 + dp[i - coin]) 也會將amount+1+1這個值過濾掉的,即amount + 1仍然是無效的。 因為數組中的有效值不會超過amount+1,就算有1塊錢的硬幣,最大值也就是amount,因此在取兩個數的最小值時已經自動將amount+1這個值過濾掉了。

3、參考鏈接

動態規劃、完全背包、BFS(包含完全背包問題公式推導)
labuladong的公眾號文章

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

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

相關文章

linux上的英文字體monospace可以在windows用嗎?

linux的字體都是開源的&#xff0c;應該可以官方下載本地下載轉載于:https://www.cnblogs.com/52linux/archive/2012/03/14/2396103.html

Flash Builder 創建CSS

1.global 選擇器將樣式應用于所有控件 在 Flash Builder 中創建新MXML 文件并切換到設計模式 屬性視圖右側的外觀視圖可更改外觀 Flash Builder 自動創建CSS 文件 CSS 文件有2 個命名空間&#xff1a; s 指 Spark 組件 mx 指 MX 組件 1. Global 與Application 選擇器 global …

ruby打印_Ruby程序打印數字的力量

ruby打印Ruby中數字的冪 (Power of a number in Ruby) The task to develop a program that prints power of a number in Ruby programming language. 開發可以用Ruby編程語言打印數字冪的程序的任務。 If we want to calculate the power of a number manually then we have…

二、訓練fashion_mnist數據集

一、加載fashion_mnist數據集 fashion_mnist數據集中數據為28*28大小的10分類衣物數據集 其中訓練集60000張&#xff0c;測試集10000張 from tensorflow import keras import tensorflow as tf import matplotlib.pyplot as plt import numpy as npfashion_mnist keras.data…

jquerymobile 切換頁面時候閃爍問題

https://github.com/jquery/jquery-mobile/commit/acbec71e29b6acec6cd2087e84e8434fecc0053f 可以修改css好像是個bug -4,9 4,10 * Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.*/.spin {--webkit-animation-name: spin;--webkit-an…

二分法:兩個有序數組長度為N,找到第N、N+1大的數

題目 兩個有序數組長度為N&#xff0c;找到第N、N1大的數 思路1&#xff1a;雙指針&#xff0c;O(N)復雜度 簡述思路&#xff1a; 如果當前A指針指向的數組A的內容小于B指針指向的數組B的內容&#xff0c;那么A指針往右移動&#xff0c;然后nums(當前已經遍歷過的數字個數)也…

Javascript -- In

http://www.caveofprogramming.com/articles/javascript-2/javascript-in-using-the-in-operator-to-iterate-through-arrays-and-objects/ http://msdn.microsoft.com/en-us/library/ie/9k25hbz2(vvs.94).aspx轉載于:https://www.cnblogs.com/daishuguang/p/3392310.html

三、自動終止訓練

有時候&#xff0c;當模型損失函數值預期的效果時&#xff0c;就可以結束訓練了&#xff0c;一方面節約時間&#xff0c;另一方面防止過擬合 此時&#xff0c;設置損失函數值小于0.4&#xff0c;訓練停止 from tensorflow import keras import tensorflow as tf import matplo…

矩陣形狀| 使用Python的線性代數

Prerequisite: Linear Algebra | Defining a Matrix 先決條件&#xff1a; 線性代數| 定義矩陣 In the python code, we will add two Matrices. We can add two Matrices only and only if both the matrices have the same dimensions. Therefore, knowing the dimensions o…

[數據庫]oracle客戶端連服務器錯誤

昨天晚上和今天上午用11g客戶端連同事10g服務器&#xff0c;報錯&#xff1a; The Network Adapter could not establish the connection 檢查嘗試了好多次都沒好。 用程序連&#xff0c;依舊是報這個錯&#xff0c;所以一查就解決了&#xff01; 參考&#xff1a;http://apps…

ASP.NET 抓取網頁內容

&#xff08;轉&#xff09;ASP.NET 抓取網頁內容 ASP.NET 抓取網頁內容&#xff0d;文字 ASP.NET 中抓取網頁內容是非常方便的&#xff0c;而其中更是解決了 ASP 中困擾我們的編碼問題。 需要三個類&#xff1a;WebRequest、WebResponse、StreamReader。 WebRequest、WebRespo…

leetcode 53. 最大子序和 動態規劃解法、貪心法以及二分法

題目 給定一個整數數組 nums &#xff0c;找到一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4] 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大&#xff0c;為 6。 進階: 如果你…

四、卷積神經網絡(Convolution Neural Networks)

一、CNN(Convolution Neural Networks) 卷積神經網絡基本思想&#xff1a;識別物體的特征&#xff0c;來進行判斷物體 卷積Convolution&#xff1a;過濾器filter中的數值與圖片像素值對應相乘再相加&#xff0c;6 * 6卷積一次(步數為1)變成4 * 4 Max Pooling&#xff1a;對卷積…

POJ3096Surprising Strings(map)

題意&#xff1a;輸入很多字符串&#xff0c;以星號結束。判斷每個字符串是不是“Surprising Strings”&#xff0c;判斷方法是&#xff1a;以“ZGBG”為例&#xff0c;“0-pairs”是ZG&#xff0c;GB&#xff0c;BG&#xff0c;這三個子串不相同&#xff0c;所以是“0-unique”…

vs助手使用期過 編譯CEGUI的問題:error C2061: 語法錯誤: 標識符“__RPC__out_xcount_part” VS2010...

第一個問題&#xff0c;下一個破解版的VX_A.dll&#xff0c;將其覆蓋以前的dll即可&#xff0c; 但是目錄有所要求&#xff0c;如下&#xff1a; XP系統&#xff1a;系統盤\Documents and Settings\用戶名\Local Settings\Application win7或者vistaData\Microsoft\VisualStud…

五、項目實戰---識別人和馬

一、準備訓練數據 下載數據集 validation驗證集 train訓練集 數據集結構如下&#xff1a; 將數據集解壓到自己選擇的目錄下就行 最后的結構效果如下&#xff1a; 二、構建模型 ImageDataGenerator 真實數據中&#xff0c;往往圖片尺寸大小不一&#xff0c;需要裁剪成一樣…

leetcode 122. 買賣股票的最佳時機 II 思考分析

目錄題目貪心法題目 給定一個數組&#xff0c;它的第 i 個元素是一支給定股票第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易&#xff08;多次買賣一支股票&#xff09;。 注意&#xff1a;你不能同時參與多筆交易&#xff08;你必…

css設置a連接禁用樣式_使用CSS禁用鏈接

css設置a連接禁用樣式Question: 題&#xff1a; Links are one of the most essential aspects of any web page or website. They play a very important role in making our website or web page quite responsive or interactive. So the topic for discussion is quite pe…

服務器出現 HTTP 錯誤代碼,及解決方法

HTTP 400 - 請求無效 HTTP 401.1 - 未授權&#xff1a;登錄失敗 HTTP 401.2 - 未授權&#xff1a;服務器配置問題導致登錄失敗 HTTP 401.3 - ACL 禁止訪問資源 HTTP 401.4 - 未授權&#xff1a;授權被篩選器拒絕 HTTP 401.5 - 未授權&#xff1a;ISAPI 或 CGI 授權失敗 HTTP 40…

leetcode 55. 跳躍游戲 思考分析

題目 給定一個非負整數數組&#xff0c;你最初位于數組的第一個位置。 數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個位置。 示例1&#xff1a; 輸入: [2,3,1,1,4] 輸出: true 解釋: 我們可以先跳 1 步&#xff0c;從位置 0 到達 位置 1…