322 零錢兌換 動態規劃和貪心

2022-03-20 01:29:31 字數 1060 閱讀 8846

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

基本是按照這篇題解的思路

貪心11. 想要總硬幣數最少,肯定是優先用大面值硬幣,所以對 coins 按從大到小排序

12. 先丟大硬幣,再丟會超過總額時,就可以遞迴下一層丟的是稍小面值的硬幣

乘法對加法的加速

21. 優先丟大硬幣進去嘗試,也沒必要乙個乙個丟,可以用乘法算一下最多能丟幾個

k = amount / coins[c_index] 計算最大能投幾個

amount - k * coins[c_index] 減去扔了 k 個硬幣

count + k 加 k 個硬幣

如果因為丟多了導致最後無法湊出總額,再回溯減少大硬幣數量

最先找到的並不是最優解

31. 注意不是現實中發行的硬幣,面值組合規劃合理,會有奇葩情況

32. 考慮到有 [1,7,10] 這種用例,按照貪心思路 10 + 1 + 1 + 1 + 1 會比 7 + 7 更早找到

33. 所以還是需要把所有情況都遞迴完

ans 瘋狂剪枝

41. 貪心雖然得不到最優解,但也不是沒用的

42. 我們快速算出乙個貪心的 ans 之後,雖然還會有奇葩情況,但是絕大部分普通情況就可以瘋狂剪枝了

class solution 

public void helper(int coins,int res,int index,int all)

if(index<0) //說明這種移動不能得到乙個有效值,所以直接返回。

return;

for(int i=all/coins[index];i>=0&&res+i使用dp來做,讓amount從小到大增加,使得後面的dp值復用前面的

class solution

dp[i]=min;

}return dp[amount]==integer.max_value?-1:dp[amount];

}}

(動態規劃)322 零錢兌換

還幾天沒有更新部落格,是不是想我了 自戀狂哈哈 這幾天主要是老闆讓研究pointnet,因為環境配置總是出些問題,菜雞一枚 所以耽擱了些時間。搞好了環境,然後看了幾天pointnet 於是趕快來刷刷題。今天看的仍然是一道動態規劃的題目。給定不同面額的硬幣 coins 和乙個總金額 amount。編寫...

322 零錢兌換(動態規劃)

322.零錢兌換 author wsq date 2020 10 13 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。示例 1 輸入 coins 1,...

LeetCode動態規劃 322零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 coins 2 amount...