[cc150] 硬币问题
Given an infinite number of quarters (25 cents), dimes (10 cents), nickels (5 cents) and pennies (1 cent), find how many ways to represent n cents.
思路:
从最大面值的硬币开始分析,然后依次看更小面值的硬币。假设 n = 100, 所有 valid 排列组合中
num_quarters = 0 的是一类,
num_quarters = 1 的是一类,
。。。
num_quarters = 4 的是一类
num_quarters = 0 的子集中,num_dimes = 0的是一类,num_dimes = 1的是一类,。。。
按照这种思路,可以简单的用下面的代码实现:
public int makeChange(int amount) {
int[] denoms = {25, 10, 5, 1};
return makeChange(amount, denoms, 0);
}
public int makeChange(int amount, int[] denoms, int index) {
if(index == denoms.length - 1)
return 1;
int ways = 0;
for(int i = 0; i <= amount / denoms[index]; ++i){
ways += makeChange(amount - i * denoms[index], denoms, index+1);
}
return ways;
}
上面的代码是正确的,但是不够efficient,因为存在重复运算,比如一共有60 cents时,子集A{num_quarters=2, num_dimes=0}和子集B{num_quarters=0, num_dimes=5}是相同的,计算了两次。为了避免这种情况,下面的代码进行了优化
int makeChange(int n){
int[] denoms = {25, 10, 5, 1};
int[][] map = new int[n+1][denoms.length];
return makeChange(n, denoms, 0, map);
}
int makeChange(int amount, int[] denoms, int index, int[][] map){
if(map[amount][index] > 0){
return map[amount][index];
}
if(index >= denoms.length - 1)
return 1;
int denomAmount = denoms[index];
int ways = 0;
for(int i = 0; i * denomAmount <= amount; i++){
int amountRemaining = amount - i * denomAmount;
ways += makeChange(amountRemaining, denoms, index +1 , map);
}
map[amount][index] = ways;
return ways;
}
[cc150] 硬币问题的更多相关文章
- 二刷Cracking the Coding Interview(CC150第五版)
第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...
- 面试题目——《CC150》递归与动态规划
面试题9.1:有个小孩正在上楼梯,楼梯有n个台阶,小孩一次可以上1阶.2阶或者3阶.实现一个方法,计算小孩有多少种上楼梯的方式. 思路:第4个数是前三个数之和 注意:能不能使用递归,能不能建立一个很大 ...
- [LeetCode] Arranging Coins 排列硬币
You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...
- [LeetCode] Coin Change 硬币找零
You are given coins of different denominations and a total amount of money amount. Write a function ...
- 【bzoj1708】[USACO2007 Oct]Money奶牛的硬币
题目描述 在创立了她们自己的政权之后,奶牛们决定推广新的货币系统.在强烈的叛逆心理的驱使下,她们准备使用奇怪的面值.在传统的货币系统中,硬币的面值通常是1,5,10,20或25,50,以及100单位的 ...
- SQL 谜题(硬币的组合)
问题:早在ITPUB中看过有个SQL高手,喜欢出谜题,以下是一个谜题.我试用SQL SERVER解决此问题. 用1分,5分,10分,25分,50分硬币凑成一元,总共有几种组合办法? SELECT'1* ...
- 洛谷P2964 [USACO09NOV]硬币的游戏A Coin Game
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- [luogu2964][USACO09NOV][硬币的游戏A Coin Game] (博弈+动态规划)
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- 面试题目——《CC150》高等难题
面试题18.1:编写一个函数,将两个数字相加.不得使用+或其他算数运算符. package cc150.high; public class Add { public static void main ...
随机推荐
- mongodb添加权限
1.连接mongodb数据库(如果mongo命令没有做环境变量配置,需要定位到有mongo命令的目录) root@AY140709212620347s22Z:~# mongo MongoDB shel ...
- C#控制台输入
学习C语言后,在学习C#会有一个很不适应的小毛病.那就是在C语言里面你可以在一行输入好几个数字或是字母然后分别赋给相应的变量.可是在C#里面就不一样了,它只能读取一行.要实现一个一个变量赋值那就只有一 ...
- 工作流引擎Activiti使用总结
http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...
- left join 改写标量子查询
数据库环境:SQL SERVER 2005 有一博彩的赔率是1:20,它有2张业务表:smuchs(投注表),lottery(开奖表). smuchs表有3个字段,分别是sno(投注号码).smuch ...
- Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel
Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只 ...
- 批处理 Mysql Findstr
@set Dump_IP=localhost @set User_Name=root @set Password=1234 @set curPath=%~dp0 mysql -h %Dump_IP% ...
- Razor引擎学习:RenderBody,RenderPage和RenderSection
ASP.NET MVC 3 已经正式发布了,现在估计许多人都在拼命学,我也不能例外,刚刚看到了一篇文章,介绍了三个非常有用的方法:RenderBody,RenderPage和RenderSection ...
- C# ACM poj1002
排序 public static void acm1002(string[] azx) { string[] a = new string[azx.Length]; ; i < azx.Leng ...
- java集合框架示例图
- activemq spring 配置
Apache ActiveMQ是最流行和最强大的开源消息集成模式服务器.Apache ActiveMQ是速度快,支持多跨语言的客户端和协议,带有易于使用企业集成模式和许多先进的功能在充分支持JMS 1 ...