当前位置:   article > 正文

力扣---零钱兑换---动态规划

力扣---零钱兑换---动态规划

思路:

 这是一道典型的动态规划问题(希望下次不用提示,能直接认出来):我将g[i]定义为总金币为i所需的最少硬币个数。所以递推公式可以表示为:g[i]=min(g[i-1],g[i-2],g[i-5])+1,也就是g[i]=min(g[i-coins[j])+1。数组初始化就是g[0]=0,g[coins[j]]=1。需要注意的是:

coins[i]的最大值是INT_MAX,所以我更习惯用LONG_MAX为g赋初值。其次,因为无法开很大的数组,同时注意到coins[i]>amount的部分是没有意义的,所以只需要开amount大的数组即可。

代码:

C++:

  1. class Solution {
  2. public:
  3. int coinChange(vector<int>& coins, int amount) {
  4. vector<long> g(10010,LONG_MAX);
  5. int len=coins.size();
  6. //初始化
  7. g[0]=0;
  8. for(int i=0;i<len;i++){
  9. if(coins[i]>amount){continue;}
  10. else{g[coins[i]]=1;}
  11. }
  12. //dp g[i]=min(g[i-coins[j]])+1
  13. for(int i=1;i<amount+1;i++){
  14. for(int j=0;j<len;j++){
  15. if(i-coins[j]>=0 && g[i-coins[j]]!=LONG_MAX){
  16. g[i]=min(g[i],g[i-coins[j]]+1);
  17. }
  18. }
  19. }
  20. if(g[amount]==LONG_MAX){
  21. return -1;
  22. }
  23. else{return g[amount];}
  24. }
  25. };

Python:

  1. class Solution:
  2. def coinChange(self, coins: List[int], amount: int) -> int:
  3. g=[float("inf")]*10010
  4. len_coins=len(coins)
  5. g[0]=0
  6. for i in range(len_coins):
  7. if coins[i]>amount:
  8. continue
  9. else:
  10. g[coins[i]]=1
  11. for i in range(1,amount+1):
  12. for j in range(len_coins):
  13. if i-coins[j]>=0 and g[i-coins[j]]!=float("inf"):
  14. g[i]=min(g[i],g[i-coins[j]]+1)
  15. if g[amount]==float("inf"):
  16. return -1
  17. else:
  18. return g[amount]

明天将更新力扣---最长有小括号

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/295118
推荐阅读
相关标签
  

闽ICP备14008679号