标签:int coins 钞票 零钱 amount DP LeetCode dp
题目:已知不同面值的钞票,求如 何用最少数量的钞票组成某个金额,求可 以使用的最少钞票数量。如果任意数量的已知面值钞票都无法组成该金额, 则返回-1。
示例:
Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Input: coins = [2], amount = 3
Output: -1
解题步骤:
1、首先将原问题拆分为子问题
-
已知什么?显而易见,钞票的金额都只需要其本身1张即可
-
如何在已知钞票的情况下构造出 金额X需要的最少钞票组合
2、确认状态
DP[0] - DP[amount] 表示构造金额amount需要的最小钞票数
3、确认边界状态(初试条件)
-
DP[coin] = 1 其他的都未知初始值设为 -1
-
例如coins = [1, 2, 5], amount = 11 已知 dp[1]、dp[2]、dp[5] =1
-
现在已知 DP[coin] 需要求出每一个DP[amount]
4、状态转移方程
dp[i] = min(dp[i-1], dp[i-2], dp[i-5]) + 1
代码实现:
public static int coinChange(int[] coins, int amount) { int len = coins.length; if (len == 0 || amount < 0) { return -1; } if (amount == 0) { return 0; } int[] dp = new int[amount + 1]; // 初始化 for (int i = 0; i <= amount; i++) { dp[i] = -1; } for (int i = 0; i < len; i++) { if (coins[i] == amount) return 1; if (coins[i] < amount) dp[coins[i]] = 1; } // 状态转移方程 for (int i = 1; i <= amount; i++) { for (int j = 0; j < len; j++) { if ((i - coins[j] >= 0) && dp[i - coins[j]] != -1) { if (dp[i] == -1 || dp[i] > dp[i - coins[j]] + 1) { dp[i] = dp[i - coins[j]] + 1; } } } } // 返回值 return dp[amount]; }
标签:int,coins,钞票,零钱,amount,DP,LeetCode,dp 来源: https://www.cnblogs.com/jlutiger/p/11950059.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。