LeetCode 322. 零钱兑换(DP)
文章目录
- 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)相关推荐
- golang力扣leetcode 322.零钱兑换
322.零钱兑换 322.零钱兑换 题解 代码 322.零钱兑换 322.零钱兑换 题解 //state: dp[i]金额为i时所需最少硬币个数 //function: dp[i]=dp[i-n]+1 ...
- leetcode: 322.零钱兑换
322.零钱兑换 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/coin-change/ 给你一个整数数组 coins ,表示不同面额的硬币:以及一 ...
- LeetCode 322. 零钱兑换
322. 零钱兑换 难度 中等 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组 ...
- Java实现 LeetCode 322 零钱兑换
322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输 ...
- [LeetCode] 322.零钱兑换 五种方法讲解
322.零钱兑换 五种方法讲解 文章目录 322.零钱兑换 五种方法讲解 1 问题描述 2 问题分析 3 解决策略 3.1 递归-暴力解决 3.2 递归-加入存储 3.3 BFS 3.4 动态规划-自 ...
- Leetcode.322 零钱兑换
索引iii表示 amountamountamount 金额,dp[i]dp[i]dp[i] 表示最少 coinscoinscoins 个数. 递归 class Solution {int res = ...
- leetcode 322. 零钱兑换 思考分析
目录 1.题目 2.思路分析 3.参考链接 1.题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...
- Leetcode 322.零钱兑换
Time: 20190906 Type: Medium 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币 ...
- 99. Leetcode 322. 零钱兑换 (动态规划-完全背包)
步骤一.确定状态: 确定dp数组及下标含义 dp数组是个amout+1的数组,dp[j]表示的是装满容量为j的背包所需要的最 少物品的个数 步骤二.推断状态方程: 对于当前物品i, 有两种选择决定了d ...
最新文章
- 国有大型企业数据级同城异地灾难备份案例
- 使用 python 获取 httpd 程序所占用物理内存
- 开发者测试你必须知道的7件事
- matlab分析电池特性,基于Matlab_Simulink的光伏电池特性仿真研究
- 收藏:如何实现路由器的本地验证和授权
- 集合类之番外篇:深入解析HashMap、HashTable
- 7.Linux 高性能服务器编程 --- Linux 服务器程序规范
- [来料检验]触摸屏来料检验设想
- idea类注释模板,方法注释模板。
- system.gc()和-XX:+DisableExplicitGC启动参数,以及DirectByteBuffer的内存释放
- 一些比较好的国外IT网站
- VBA-save as xlsm
- 植物大战僵尸修改阳光
- java 权限 部分截图
- 固态硬盘与机械硬盘的区别
- 完美实现无毛边异形窗体
- git 解决push报错:[rejected] master -> master (fetch first)
- mysql数据库常见的错误_MySQL数据库常见错误及解决方案
- 苹果手机计算机怎样拉到桌面,苹果手机怎样才能快速投屏到电脑屏幕上
- grapher中文版 附序列号