Coin Change

题目:

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.

Note:
You may assume that you have an infinite number of each kind of coin.

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int len=coins.size();
        if(len<=0 || amount<0) return -1;
        if(amount==0) return 0;        //对初始输入的处理
        vector<int> number(amount+1);  //动态规划典型数组
        vector<int> temp(len);         //用于判断选择哪个硬币,选择的原则是,选定该硬币后,数量最小
        for(int i=0;i<len;i++)
        {
            number[i]=-1;
        }
        number[0]=0;                   //零个硬币可以凑齐0金额
        for(int i=1;i<=amount;i++)     //从少往多,计算所有金额的硬币组成方案
        {
            //从所有选择硬币的方案中选择出,硬币数目最小的方案
            //1.针对方案中选择某种硬币的情况,进行讨论//
            for(int j=0;j<len;j++)     
            {
                 if((i-coins[j]>=0)&&(number[(i-coins[j])]!=-1))   //选择某个硬币组成方案,是否可行呢?可行的条件有两个:                                                                                            //1、减去该硬币后,金额依旧大于0
                {                                                  //2、减去该硬币后,剩余金额有可行方案
                    temp[j]=number[i-coins[j]]+1;                 
                }
                else
                {
                    temp[j]=-1;
                }
            }
           //2.选出最优方案//
            int min=INT_MAX;
            for(int j=0;j<len;j++)    
            {
                if((temp[j]!=-1)&&(temp[j]<min))
                {
                    min=temp[j];
                }
            }
            if(min==INT_MAX)                     
            {
                number[i]=-1;
            }
            else
            {
                number[i]=min;
            }
            end
        }
        return number[amount];
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值