給定不同面額的硬幣 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...