题目

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例 1:输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:输入: coins = [2], amount = 3
输出: -1说明:
你可以认为每种硬币的数量是无限的。

解决方法

解决方法1:最快的方法:

class Solution {int ans=Integer.MAX_VALUE;public int coinChange(int[] coins, int amount) {//排序Arrays.sort(coins);dfs(coins,coins.length-1,amount,0);return ans==Integer.MAX_VALUE?-1:ans;}public void dfs(int[] coins,int index,int amount,int cnt){if(index<0){return;}//优先使用金额最大的值for(int c=amount/coins[index];c>=0;c--){int na=amount-c*coins[index];int ncnt=cnt+c;if(na==0){//如果说这里等于0 说明能够组成当前要求的值ans=Math.min(ans,ncnt);break;//剪枝1}//如果走到这一步 已经比之前的方法路径长了 那么不需要再遍历了if(ncnt+1>=ans){break; //剪枝2}dfs(coins,index-1,na,ncnt);}}
}

解决方法2:
思路:

public class Solution {public int coinChange(int[] coins, int amount) {if (amount < 1) return 0;return coinChange(coins, amount, new int[amount]);}private int coinChange(int[] coins, int rem, int[] count) {if (rem < 0) return -1;if (rem == 0) return 0;if (count[rem - 1] != 0) return count[rem - 1];int min = Integer.MAX_VALUE;for (int coin : coins) {int res = coinChange(coins, rem - coin, count);if (res >= 0 && res < min)min = 1 + res;}count[rem - 1] = (min == Integer.MAX_VALUE) ? -1 : min;return count[rem - 1];}
}

解决方法3:



左边1-6表示 amount 的值,c1,c2,c3表示每一个币种的值,分别为1,2,3。
比如第一行第一列的意思是,如果我当前的amount 是 1, 那么减去一个c1,需要拼凑的剩余的金额是多少。很明显,是0.
比如第二行,也就是amount 是2 的那一行,对于c1列,减去一个c1还剩余1需要去拼凑。

然后每一行的amount,都等于左边c1,c2,c3 里面,最小的值,加上1,因为每一列c1,c2,c3计算的时候都会去减去一个c1,c2,c3对应的值,分别为1,2,3

public class Solution {public int coinChange(int[] coins, int amount) {int max = amount + 1;int[] dp = new int[amount + 1];Arrays.fill(dp, max);dp[0] = 0;for (int i = 1; i <= amount; i++) {for (int j = 0; j < coins.length; j++) {if (coins[j] <= i) {dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);}}}return dp[amount] > amount ? -1 : dp[amount];}
}

想法:

1.不懂算法的人,怎么能明白计算机的好处呢?
当你看到有些算法题目,简单的用眼睛可以看到结果的时候,可能要花点时间才能用计算机写出来解决方法,你会想,计算机简直浪费。还没有我眼睛和脑子好用。但是当数据过多的时候,出现大数据的时候,你会知道,一个很复杂巨大工作量的工作,可能在算法里面,就简单十几行,几十行代码。
尤其是在动态规划的时候。
2.算法最重要的是思路,而不是实现,所以以后做算法题的时候,要先想好逻辑。

算法------零钱兑换(Java版本)相关推荐

  1. 插入排序算法 java_排序算法实现-插入排序(Java版本)

    原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...

  2. JAVA算法:走迷宫回溯算法设计(JAVA版本)

    JAVA算法:走迷宫回溯算法设计(JAVA版本) 迷宫数组 int[][] maze = {                 {0, 1, 0, 0, 0},                 {0, ...

  3. 算法----------快乐数 (Java版本)

    编写一个算法来判断一个数 n 是不是快乐数.「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1.如 ...

  4. CSDN蓝桥杯算法题——题解Java版本——切面条

    目录 题目:切面条 答案目标: 推导过程: 解析过程: 对照Java编码1: 对照Java编码2: 总结: 题目:切面条 一根高筋拉面,中间切一刀,可以得到2根面条. 如果先对折1次,中间切一刀,可以 ...

  5. 网易实习面经中的算法题(java版本含注释)

    目录 前言 7. 整数反转(中等) 9. 回文数(简单) 14. 最长公共前缀(简单) 20. 有效的括号(简单) 23. 合并K个升序链表(困难) 64. 最小路径和(中等) 103. 二叉树的锯齿 ...

  6. JavaScript算法 — 零钱兑换问题

    一.问题 二.分析 背包问题. 构造一个初始全是最大值的一维数组dp,dp[i]就代表兑换i元所需要的最少硬币个数. 所以有:dp[i] = Math.min(dp[i], dp[i - j] + 1 ...

  7. 算法------------完全平方数(Java版本)

    题目 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少.示例 1:输入: n = 12 输出: 3 解释: 12 ...

  8. java零钱换整程序_零钱兑换 Java

    题目链接 凑成面值为 11 的最小硬币数可以由以下 3者的最小值得到: 1.凑成面值为 10 的最小硬币数 + 面值为 1 的这一枚硬币: 2.凑成面值为 9 的最小硬币数 + 面值为 2 的这一枚硬 ...

  9. 微博短链接的生成算法(Java版本)

    最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...

最新文章

  1. glibc(ptmalloc)内存暴增问题解决
  2. xgboost防止过拟合
  3. Ospaf项目-commits词频统计模块
  4. 几分钟了解阿里云云服务器ECS
  5. 博士毕业的人也会交“智商税”?现实远比我们想象的残酷……
  6. POJ-2773 欧几里得 + 二分 + 容斥
  7. (王道408考研数据结构)第五章树-第四节1:二叉树排序树(BST)及其操作
  8. 正交匹配追踪算法(OMP)
  9. 更新win7原版镜像中添加usb3.0驱动
  10. ADO 笔记 ——关于RecordCount
  11. 分享10个超级实用的Python自动化脚本
  12. 2.安装Clouda框架
  13. 中国朝代历史,名字的简介
  14. vue,el-image 图片引入根路径@无效
  15. 八年级上册历史知识点(第1课 鸦片战争)
  16. vim java win
  17. 竞技体育数据可视化与可视化分析综述
  18. flex布局设置宽度不生效,高度生效
  19. 网名闲话之“茶乡浪子”
  20. EBS: Inventory 模块的两个 package: INV_TXN_MANAGER_PUB INV_LPN_TRX_PUB

热门文章

  1. C++中如何访问全局变量和全局函数
  2. matlab 电磁兼容仿真软件,EMC Studio免费版
  3. python day08
  4. 软件体系架构阅读笔记一
  5. Mac下编译Android源码,并导入IntelliJ IDEA进行源码阅读
  6. 四级嵌入式系统开发工程师-计算题题库
  7. 软件测试艺术一:程序正确性证明
  8. JavaScript学习笔记:检测数组方法
  9. 当当网首页——JS代码
  10. VS2015使用scanf报错解决方案