LeetCode之找零钱
题目:
已知不同面值的钞票,求如 何用最少数量的钞票组成某个金额,求可 以使用的最少钞票数量。如果任意数量的已知面值钞票都无法组成该金额, 则返回-1。
示例:
Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Input: coins = [2], amount = 3
Output: -1
解题步骤:
1、首先将原问题拆分为子问题
- 已知什么?显而易见,钞票的金额都只需要其本身1张即可 
- 如何在已知钞票的情况下构造出 金额X需要的最少钞票组合 
2、确认状态
DP[0] - DP[amount] 表示构造金额amount需要的最小钞票数
3、确认边界状态(初试条件)
- DP[coin] = 1 其他的都未知初始值设为 -1 
- 例如coins = [1, 2, 5], amount = 11 已知 dp[1]、dp[2]、dp[5] =1 
- 现在已知 DP[coin] 需要求出每一个DP[amount] 
4、状态转移方程
dp[i] = min(dp[i-1], dp[i-2], dp[i-5]) + 1
代码实现:
 public static int coinChange(int[] coins, int amount) {
        int len = coins.length;
        if (len == 0 || amount < 0) {
            return -1;
        }
        if (amount == 0) {
            return 0;
        }
        int[] dp = new int[amount + 1];
        // 初始化
        for (int i = 0; i <= amount; i++) {
            dp[i] = -1;
        }
        for (int i = 0; i < len; i++) {
            if (coins[i] == amount)
                return 1;
            if (coins[i] < amount)
                dp[coins[i]] = 1;
        }
        // 状态转移方程
        for (int i = 1; i <= amount; i++) {
            for (int j = 0; j < len; j++) {
                if ((i - coins[j] >= 0) && dp[i - coins[j]] != -1) {
                    if (dp[i] == -1 || dp[i] > dp[i - coins[j]] + 1) {
                        dp[i] = dp[i - coins[j]] + 1;
                    }
                }
            }
        }
        // 返回值
        return dp[amount];
    }
LeetCode之找零钱的更多相关文章
- [LeetCode] 由 “找零钱" 所想
		Ref: [Optimization] Dynamic programming[寻找子问题] Ref: [Optimization] Advanced Dynamic programming[优于re ... 
- PAT-乙级-1037. 在霍格沃茨找零钱(20)
		1037. 在霍格沃茨找零钱(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 如果你是哈利·波特迷,你会知 ... 
- 贪心算法-找零钱(C#实现)
		找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下. 首先拖出一个界面来,最下面是一个listbox控件 对应的代码:问题比较简单, ... 
- PAT 1037 在霍格沃茨找零钱(20)(代码+思路)
		1037 在霍格沃茨找零钱(20)(20 分) 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon) ... 
- PAT 乙级 1037 在霍格沃茨找零钱(20)C++版
		1037. 在霍格沃茨找零钱(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 如果你是哈利·波特迷,你会知 ... 
- 【算法笔记】B1037 在霍格沃茨找零钱
		1037 在霍格沃茨找零钱 (20 分) 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特( ... 
- PAT——乙级1022:D进制的A+B &乙级1037:在霍格沃茨找零钱
		1022 D进制的A+B (20 point(s)) 输入两个非负 10 进制整数 A 和 B (≤230−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输入在一行中依 ... 
- 动态规划--找零钱 coin change
		来自http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/ 对于整数N,找出N的所有零钱的表示.零钱可以用S={s1,s ... 
- PAT (Basic Level) Practise (中文)-1037. 在霍格沃茨找零钱(20)
		PAT (Basic Level) Practise (中文)-1037. 在霍格沃茨找零钱(20) http://www.patest.cn/contests/pat-b-practise/1037 ... 
随机推荐
- OO——JML作业总结
			目录 第三单元博客作业 JML语言理论基础 1.注释结构 2.JML表达式 3.方法规格 4.类型规格 应用工具链 JMLUnitNG使用实例 作业架构设计 第一次作业 第二次作业 第三次作业 BUG ... 
- 【JavaWEB SSH】jsp页面传值后台Controller 部分值绑定不上实体类
			//前端ajax代码 1 var oldpassword = $('#old_password').val(); var password = $('#L_pass').val(); var user ... 
- JavaScript箭头函数中的this详解
			前言 箭头函数极大地简化了this的取值规则. 普通函数与箭头函数 普通函数指的是用function定义的函数: var hello = function () { console.log(" ... 
- 导出带图片的Excel——OOXML文件分析
			需求: 普通js导出文件excel具有兼容性问题,通过js-xsl导出文件API未找到导出图片的方案,实例过少,因此针对07年后以.xlsx后缀的excel文件,通过修改后缀.zip参考文件模板来实现 ... 
- 分布式结构化存储系统-HBase应用案例
			分布式结构化存储系统-HBase应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 为了让读者更进一步了解HBase在实际生成环境中的应用方法,在董西成的书里介绍两个经典的HB ... 
- 数据库类型对应Java语言类型表
			下表列出了基本 SQL Server.JDBC 和 Java 编程语言数据类型之间的默认映射: SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型 big ... 
- Python_Day2_共享你的代码
			一.编写简单的函数,保存一下. # coding=utf-8 """ 这是“nester.py”模块,提供了一个名为print_lol的函数,这个函数的作用是打印列表,其 ... 
- 走迷宫(bfs, 最短路)
			Input 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... ... 
- puppeteer  UI自动化测试demo(一)
			一.简介 这个不大常见,比较常见的是selenium和weddriver: 所以就增加一个说明,来自官网的. Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTool ... 
- js实现点击按钮时显示弹框,点击按钮及弹框以外的区域时隐藏弹框
			转自https://blog.csdn.net/yimawujiang/article/details/86496936 问题:js实现点击按钮时显示弹框,点击按钮及弹框以外的区域时隐藏弹框? 方案一 ... 
