您会得到不同面额的硬币和总金额。编写一个函数来计算组成该数量所需的最少数量的硬币。如果这笔钱不能用硬币的任何组合来弥补,请返回-1。
范例1:
输入:硬币= [1, 2, 5],数量= 11
输出:3
说明: 11 = 5 + 5 + 1
思路:
这一题我是比较蒙的,一开始是用的栈来做,但是通过率不能100%,所以是错误的。
然后用了dp动态规划的方法来做。
关系式最重要为:dp[ i] =min(dp[i ] , dp[ i- coin ]+1 )
就是当前amount的方法数等于和比当前的总额少coin的 方法数+1的较小值。
每一个硬币代表了一个数额,对每个硬币走一遍,最后得出来的就是对于当前这个数综合所有硬币得出的最小种类数
code
//第一种方法想错了,最少的出现情况,不应该只有从最大那个数字开始的计算。
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount +1,amount+1); //为了设置最后返回的时候看有没有能够组成i的方法。如果大于amount,就没有,返回-1
dp[0]=0; //数为0的,方法数也为0 ,这就是基础
for(int coin:coins)
for(int i=coin;i<=amount;++i)
dp[i]=min (dp[i], dp[i-coin]+1);
return dp[amount] >amount ? -1:dp[amount];
}