标签:实现 leetcode 组成 pre 背包问题 问题 组合 示例 代码
1.题目链接
https://leetcode-cn.com/problems/coin-change/
2.题目描述
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3 输出: -1
说明:
你可以认为每种硬币的数量是无限的。
3.题目解析
这道题目可以看做背包问题,用动态规划实现,dp[i]为金额i需要最少金额的个数,对于任意金额j,dp[j] = Min(dp[j], dp[j - coins[i]] + 1);如果j - coins[i]存在,既能满足条件。
4.代码实现
int Min(int a, int b) { if(a < b) return a; else return b; } int coinChange(int* coins, int coinsSize, int amount){ int *dp = (int*)malloc((amount + 1) * sizeof(int)); dp[0] = 0; for (int i = 1; i <= amount; i++) { dp[i] = amount + 1; } for (int i = 0; i < coinsSize; i++) { for (int j = coins[i]; j < amount + 1; j++) { dp[j] = Min(dp[j], dp[j - coins[i]] + 1); } } if (dp[amount] > amount) return -1; return dp[amount]; }
5.提交记录
执行用时分布
标签:实现 leetcode 组成 pre 背包问题 问题 组合 示例 代码
原文地址:https://www.cnblogs.com/zygote/p/13118231.html