给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

示例 1:

输入: coins = [1, 2, 5], amount = 11
输出: 3 
解释: 11 = 5 + 5 + 1
示例 2:

输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。

思路:每一个数据都可以看做前面某一个dp[x]加上一个coins[i]的值,如果找不到这样的数字,那说明无法进行兑换

提交的代码:

class Solution {
    public int coinChange(int[] coins, int amount) {
     int i,j;
        Arrays.sort(coins);
        int n = coins.length;
        int[] dp = new int[amount+1];
        int min = Integer.MAX_VALUE;
        dp[0] = 0;
        if(amount==0)
        {
            return 0;
        }
        for(i=1;i<=amount;i++)
        {
            min = Integer.MAX_VALUE;
            for(j=0;j<n;j++)
            {
                if(i-coins[j]>=0)
                {
                    if(dp[i-coins[j]] != Integer.MAX_VALUE)
                    {
                        min = java.lang.Math.min(min, dp[i-coins[j]]+1);
                    }

}
                else
                {
                    break;
                }
            }
            dp[i] = min;
        }
        if(dp[amount]!=Integer.MAX_VALUE)
        {
             return dp[amount];
        }
        else
        {
            return -1;
        }
    }
}

完整的代码:

import java.util.Arrays;

public class Solution322 {
    public static int coinChange(int[] coins, int amount) {
        int i,j;
        Arrays.sort(coins);
        int n = coins.length;
        int[] dp = new int[amount+1];
        int min = Integer.MAX_VALUE;
        dp[0] = 0;
        if(amount==0)
        {
            return 0;
        }
        for(i=1;i<=amount;i++)
        {
            min = Integer.MAX_VALUE;
            for(j=0;j<n;j++)
            {
                if(i-coins[j]>=0)
                {
                    if(dp[i-coins[j]] != Integer.MAX_VALUE)
                    {
                        min = java.lang.Math.min(min, dp[i-coins[j]]+1);
                    }

}
                else
                {
                    break;
                }
            }
            dp[i] = min;
        }
        if(dp[amount]!=Integer.MAX_VALUE)
        {
             return dp[amount];
        }
        else
        {
            return -1;
        }
    }
    public static void main(String[] args)
    {
        int[] coins = {186,419,83,408};
        int amount = 6249;
        System.out.println(coinChange(coins,amount));
    }
}

Leetcode--322. 零钱兑换相关推荐

  1. leetcode: 322.零钱兑换

    322.零钱兑换 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/coin-change/ 给你一个整数数组 coins ,表示不同面额的硬币:以及一 ...

  2. LeetCode 322. 零钱兑换(DP)

    文章目录 1. 题目信息 2. 解题 2.1 回溯穷举 2.2 动态规划 1. 题目信息 给定不同面额的硬币 coins 和一个总金额 amount. 编写一个函数来计算可以凑成总金额所需的最少的硬币 ...

  3. golang力扣leetcode 322.零钱兑换

    322.零钱兑换 322.零钱兑换 题解 代码 322.零钱兑换 322.零钱兑换 题解 //state: dp[i]金额为i时所需最少硬币个数 //function: dp[i]=dp[i-n]+1 ...

  4. Java实现 LeetCode 322 零钱兑换

    322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输 ...

  5. [LeetCode] 322.零钱兑换 五种方法讲解

    322.零钱兑换 五种方法讲解 文章目录 322.零钱兑换 五种方法讲解 1 问题描述 2 问题分析 3 解决策略 3.1 递归-暴力解决 3.2 递归-加入存储 3.3 BFS 3.4 动态规划-自 ...

  6. LeetCode 322. 零钱兑换

    322. 零钱兑换 难度 中等 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组 ...

  7. Leetcode.322 零钱兑换

    索引iii表示 amountamountamount 金额,dp[i]dp[i]dp[i] 表示最少 coinscoinscoins 个数. 递归 class Solution {int res = ...

  8. Leetcode 322.零钱兑换

    Time: 20190906 Type: Medium 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币 ...

  9. leetcode 322. 零钱兑换 思考分析

    目录 1.题目 2.思路分析 3.参考链接 1.题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总 ...

  10. 99. Leetcode 322. 零钱兑换 (动态规划-完全背包)

    步骤一.确定状态: 确定dp数组及下标含义 dp数组是个amout+1的数组,dp[j]表示的是装满容量为j的背包所需要的最 少物品的个数 步骤二.推断状态方程: 对于当前物品i, 有两种选择决定了d ...

最新文章

  1. opencv python 中cv2.putText()函数的用法
  2. Winform中使用控件的Dock属性设计窗体布局,使不随窗体缩放而改变
  3. Hive JOIN使用详解
  4. SQL大圣之路笔记——PowerDesigner之新建table、view、proc
  5. MapReduce之二次排序
  6. jQuery.Validate.js验证大表单的优化
  7. markdown pad2注册码(2017年9月27日)
  8. C盘系统文件提示损坏怎么办?系统文件损坏怎么修复
  9. eact源码解析7.Fiber架构
  10. #荣耀双十一# 就是耀免单,年度旗舰任性送
  11. 股票数据API接口文档说明
  12. 【时间之外】面向监狱的编程?该学学网络安全法了(2)
  13. 学好单片机好找工作吗?单片机学到什么程度可以找工作?
  14. java spider爬虫_Java网络爬虫实操(2)
  15. 人物抠图 php,php抠图教程(混合模式+剪切蒙版)
  16. Android逆向之八门神器原理解析(主要分析其修改内存原理)
  17. ID 生成器 雪花算法
  18. 怎么更新服务器上的项目,更新服务器的项目
  19. java 指定打印机 进行打印
  20. SCL-90心理测试系统(基于c语言)

热门文章

  1. 程序员面试金典 - 面试题 10.05. 稀疏数组搜索(二分查找)
  2. LeetCode 1046. 最后一块石头的重量(priority_queue 堆)
  3. 动态规划应用--找零钱
  4. firefox应用自动全屏显示_【b】—自动化测试:基础selenium—API
  5. 协程asyncio_Asyncio深入浅出
  6. svr公式推导_ML-支持向量:SVM、SVC、SVR、SMO原理推导及实现
  7. 编php矩阵求和,PHP二维数组如何求和?
  8. 知识图谱入门知识(三)词性标注
  9. 论文浅尝 | KGAT: 用于推荐的知识图注意力网络
  10. 论文浅尝 - ICML2020 | 拆解元学习:理解 Few-Shots 任务中的特征表示