322. Coin Change(硬币兑换dp)

您会得到不同面额的硬币和总金额。编写一个函数来计算组成该数量所需的最少数量的硬币。如果这笔钱不能用硬币的任何组合来弥补,请返回-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];
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值