文章目录

  • 1. 题目信息
  • 2. 解题
    • 2.1 回溯穷举
    • 2.2 动态规划

1. 题目信息

给定不同面额的硬币 coins 和一个总金额 amount。
编写一个函数来计算可以凑成总金额所需的最少的硬币个数
如果没有任何一种硬币组合能组成总金额,返回 -1。

示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1示例 2:
输入: coins = [2], amount = 3
输出: -1说明:
你可以认为每种硬币的数量是无限的。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/coin-change
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:LeetCode 518. 零钱兑换 II(动态规划)

2.1 回溯穷举

超时

class Solution//回溯
{public:int coinChange(vector<int>& coins, int amount){int minPieces = INT_MAX;money(coins, amount, 0, 0, minPieces);if(minPieces != INT_MAX)return minPieces;elsereturn -1;}void money(vector<int>& coins, int &amount, long curMoney, int curPieces, int &minPieces){if(curMoney > amount){curPieces = INT_MAX;//表示不存在return;}if(curMoney == amount){if(curPieces < minPieces)minPieces = curPieces;return;}for(int i = 0; i < coins.size(); ++i){money(coins, amount,curMoney+coins[i], curPieces+1, minPieces);}}
};

2.2 动态规划

states[i]表示找 i 元需要的最少张数
那么states[i] = min{states[i-coins[j]] | j = 0,1,…coins.size() }+1

class Solution {public:int coinChange(vector<int>& coins, int amount) {if(amount < 1)return 0;int states[amount+1];int i, j;for(i = 0; i <= amount; ++i)states[i] = amount+1;//找i元钱,不可能需要amount+1张states[0] = 0;for(i = 0; i <= amount; ++i){for(j = 0; j < coins.size(); ++j){if(i-coins[j] >= 0 && states[i] > states[i-coins[j]]+1){states[i] = states[i-coins[j]]+1;}}}if(states[amount] != amount+1)return states[amount];elsereturn -1;}
};
class Solution { //2020.3.8
public:int coinChange(vector<int>& coins, int amount) {if(amount <= 0)return 0;int n = coins.size(), j, m;vector<int> dp(amount+1, INT_MAX);dp[0] = 0;for(j = 0; j <= amount; ++j)//遍历所有的金额数{if(dp[j] != INT_MAX){for(m = 0; m < n; ++m){if(j <= amount-coins[m])dp[j+coins[m]] = min(dp[j]+1, dp[j+coins[m]]);}}}if(dp[amount] != INT_MAX)return dp[amount];return -1;}
};

LeetCode 322. 零钱兑换(DP)相关推荐

  1. golang力扣leetcode 322.零钱兑换

    322.零钱兑换 322.零钱兑换 题解 代码 322.零钱兑换 322.零钱兑换 题解 //state: dp[i]金额为i时所需最少硬币个数 //function: dp[i]=dp[i-n]+1 ...

  2. leetcode: 322.零钱兑换

    322.零钱兑换 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/coin-change/ 给你一个整数数组 coins ,表示不同面额的硬币:以及一 ...

  3. LeetCode 322. 零钱兑换

    322. 零钱兑换 难度 中等 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组 ...

  4. Java实现 LeetCode 322 零钱兑换

    322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输 ...

  5. [LeetCode] 322.零钱兑换 五种方法讲解

    322.零钱兑换 五种方法讲解 文章目录 322.零钱兑换 五种方法讲解 1 问题描述 2 问题分析 3 解决策略 3.1 递归-暴力解决 3.2 递归-加入存储 3.3 BFS 3.4 动态规划-自 ...

  6. Leetcode.322 零钱兑换

    索引iii表示 amountamountamount 金额,dp[i]dp[i]dp[i] 表示最少 coinscoinscoins 个数. 递归 class Solution {int res = ...

  7. leetcode 322. 零钱兑换 思考分析

    目录 1.题目 2.思路分析 3.参考链接 1.题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...

  8. Leetcode 322.零钱兑换

    Time: 20190906 Type: Medium 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币 ...

  9. 99. Leetcode 322. 零钱兑换 (动态规划-完全背包)

    步骤一.确定状态: 确定dp数组及下标含义 dp数组是个amout+1的数组,dp[j]表示的是装满容量为j的背包所需要的最 少物品的个数 步骤二.推断状态方程: 对于当前物品i, 有两种选择决定了d ...

最新文章

  1. 国有大型企业数据级同城异地灾难备份案例
  2. 使用 python 获取 httpd 程序所占用物理内存
  3. 开发者测试你必须知道的7件事
  4. matlab分析电池特性,基于Matlab_Simulink的光伏电池特性仿真研究
  5. 收藏:如何实现路由器的本地验证和授权
  6. 集合类之番外篇:深入解析HashMap、HashTable
  7. 7.Linux 高性能服务器编程 --- Linux 服务器程序规范
  8. [来料检验]触摸屏来料检验设想
  9. idea类注释模板,方法注释模板。
  10. system.gc()和-XX:+DisableExplicitGC启动参数,以及DirectByteBuffer的内存释放
  11. 一些比较好的国外IT网站
  12. VBA-save as xlsm
  13. 植物大战僵尸修改阳光
  14. java 权限 部分截图
  15. 固态硬盘与机械硬盘的区别
  16. 完美实现无毛边异形窗体
  17. git 解决push报错:[rejected] master -> master (fetch first)
  18. mysql数据库常见的错误_MySQL数据库常见错误及解决方案
  19. 苹果手机计算机怎样拉到桌面,苹果手机怎样才能快速投屏到电脑屏幕上
  20. grapher中文版 附序列号

热门文章

  1. VC++中Format用法
  2. 字符串处理问题[2]:将一个数字型…
  3. 20个正则表达式,举一反三,相信对你很有用
  4. git日常提交使用的命令行
  5. 服务网关zuul之二:过滤器--请求过滤执行过程(源码分析)
  6. 素数环 与 算法 全排列
  7. 【leetcode刷题笔记】Excel Sheet Column Number
  8. 仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG)
  9. WinForm与脚本的交互
  10. TCP如何保证可靠性