100元可以用几种方法换成多种面额的零钱?
一 ,每种至少一张,实际应为至少10元、5元各一张,1元的5张。共20元,剩下的80元可任意分配。
二,80元的零钱可以如下:
8张10元。1种
7张10元,5元的2、1、0张(差额为1元,下同)。3种
6张10元,5元的4、3、2、1、0张。5种
5张10元,5元的6、5、4、3、2、1、0张。7种
......
1张10元,5元的14、13.....6、5、4、3、2、1、0张。15种
0张10元,5元的16、15、14、13.....6、5、4、3、2、1、0张。17种
三,总的换法为
1+3+5+.....+15+17=81种
看到这个题目的第一感觉就是一个三元一次方程的求解,编程的话,就是三个for循环外加个if判断,瞬间KO。对这个题目来说效率也是可以接受的。可是这根本没有体现出算法的优势。下面我们来仔细推敲下这里面隐藏的规律。
根据上图的规律,即可得到如下代码:
/**
* 1、求解特定实例:要将100元兑换为1元、5元、10元的零钱,请问有多少种兑换方法?
*
* @return
* @author chenchanghan
*/
public static int getDivideWays() {
int count = 0;
for (int i = 0, size = 100 / 10; i <= size; i++) {
// 针对10的每个场景,计算5的组合情况(即,从0个5 到 n( n=(100 - i * 10)/5
// )个5共n+1种情况
count += (100 - i * 10) / 5 + 1;
}
return count;
}
到这里,这个就算解完了,但是这里确实因为分解的元素中包含1,将问题变的简单化了,如果不是1、5、10而是随意的三个数字,改怎么解决呢?同样还是要找出规律来。
下面我们就来分析下10、5、3如何组合成100吧。
首先,0个10的情况下,5和3怎么组合成100呢?正好20*5=100,显然这是不存在10的情况下出现最多5的情况,那还有没有其他的组合情况呢?这时我们就要用到一个最小公倍数(3和5的最小公倍数是15),很显然,我们就可以将”3个5替换成5个3“了。因为最多20个5,所以我们可以继续用”3个5替换成5个3“,直到最后剩下2个5。综上0个10的情况下,5可以出现的次数分别为20、17、14、11、8、5、2,所以该场景下共有7中组合方式。
其次,1个10的情况下,5和3怎么组合成100呢?我们还是从5来出发,5*18=90,1个10的情况下,组合成100,最多可以出现18次,同理还是用”3个5替换成5个3“。最终1个10的情况下,5可以出现的次数分别为18、15、12、9、6、3、0。该场景下也有7种组合方式。
同理,依次分析下去。
根据上面的规律,得出代码如下:
/**
* 2、组合元素一般化:将total元兑换为large元、middle元、small元的零钱,请问有多少种兑换方法?
*
* @param total
* @param large
* @param middle
* @param small
* @return
* @author chenchanghan
*/
public static int getDivideWays(int total, int large, int middle, int small) {
if (total > 0 && small > 0 && middle > small && large > middle) {
int count = 0;
int LCM = getLeastCommonMutiple(middle, small);
int substituteUnit = LCM / middle;
for (int i = 0, size = total / large; i <= size; i++) {
int restTotal = total - i * large;
if (restTotal > 0) {
// actualMaxMiddleNum>=0,表示restTotal正好可以有x个middle和y个small拼凑起来(x、y是大于等于0的整数)
int actualMaxMiddleNum = getActualMaxMiddleNum(restTotal, middle, small);
if (actualMaxMiddleNum >= substituteUnit) {
// actualMaxMiddleNum >=substituteUnit,表示可以将substituteUnit个middle替换成LCM/small个small
// 可以换多少次呢?显然可以换0、1...actualMaxMiddleNum/substituteUnit,即:actualMaxMiddleNum/substituteUnit+1
count += actualMaxMiddleNum / substituteUnit + 1;
} else if (actualMaxMiddleNum >= 0) {
// 0<=actualMaxMiddleNum
}
} else {
// 正好被large完美匹配了
count++;
}
}
return count;
} else {
throw new IllegalArgumentException();
}
}
/**
* 获得方程:x*middle + y*small = restTotal 中x最大的取值。
*
* @param restTotal
* @param middle
* @param small
* @return
* @author chenchanghan
*/
private static int getActualMaxMiddleNum(int restTotal, int middle, int small) {
int modMiddle = restTotal % middle;
int maxMiddleNum = restTotal / middle;
int actualMaxMiddleNum = -1;
if (modMiddle == 0 || modMiddle == small) {
actualMaxMiddleNum = maxMiddleNum;
} else {
// 无法使用最大数量(即:maxMiddleNum)的middle和small组合成restTotal,
// 则需要逐步减少middle的个数,进而增加small的个数,来尝试组合成restTotal。
int minusMiddleNum = getMinusMiddleNum(middle, small, modMiddle, maxMiddleNum);
if (minusMiddleNum > 0) {
// 表示可以形成一个拥有最大middle数的组合,即: (maxMiddleNum - minusMiddleNum)*middle + y*small = restTotal ;
actualMaxMiddleNum = maxMiddleNum - minusMiddleNum;
} else {
// middle和small无论怎么组合都无法拼凑成restTotal,即:x*middle + y*small = restTotal 的整数解不存在
actualMaxMiddleNum = -1;
}
}
return actualMaxMiddleNum;
}
/**
*
* @param middle
* @param small
* @param modMiddle
* @param maxMiddleNum
* @return
* @author chenchanghan
*/
private static int getMinusMiddleNum(int middle, int small, int modMiddle, int maxMiddleNum) {
int minusMiddleNum = -1;
for (int i = 1; i <= maxMiddleNum; i++) {
if ((middle * i + modMiddle) % small == 0) {
minusMiddleNum = i;
break;
}
}
return minusMiddleNum;
}
/**
* 求两个数的最小公倍数。
*
* @param middle
* @param small
* @return
* @author chenchanghan
*/
private static int getLeastCommonMutiple(int m, int n) {
return m * n / getGreatestDivisor(m, n);
}
/**
* 求两个数的最大公约数。
*
* @param m
* @param n
* @return
* @author chenchanghan
*/
private static int getGreatestDivisor(int m, int n) {
int tmp = 0;
if (m < n) {
tmp = m;
m = n;
n = tmp;
}
while ((tmp = m % n) != 0) {
m = n;
n = tmp;
}
return n;
}
我们再来推广下,将分解的元素变成3个以上,具体见如下代码:
/**
* 3、元素个数一般化:将total元兑换为a元、b元、c元、....的零钱,请问有多少种兑换方法?
*
* @param total
* @param elements
* @return
* @author chenchanghan
*/
public static int getDivideWays(int total,int[] elements){
if(elements!=null && elements.length>=3){
int count = 0 ;
if(elements.length == 3){
count += getDivideWays(total,elements[0],elements[1],elements[2]);
}else{
int large = elements[0];
int[] subElements = new int[elements.length-1];
System.arraycopy(elements, 1, subElements, 0, subElements.length);
for (int i = 0, size = total / large; i <= size; i++) {
int restTotal = total - i * large;
if (restTotal != 0) {
count += getDivideWays(restTotal, subElements);
} else {
count++;
}
}
}
return count ;
}else{
throw new IllegalArgumentException();
}
}
初一数学不等式应用题,越多越好
3.为了能有效地使用电力资源,宁波市电业局从2002年1月起进行峰谷用电试点,每天8:00至20:00用电每千瓦时0.56元(峰电价).20:00至次日8:00每千瓦时0.28元(谷电价)而目前不使用"峰谷"的居民用电每千瓦时0.53元.当"峰电"用电不超过,每月总用电量的百分之几时,使用"峰谷电"合算?(精确到1%)设总用电量...
七年级数学一元一次方程解应用题50题,
6.某车间有16名工人,每人每天可加工甲种零件5个或乙种零件4个.在这 16名工人中,一部分人加工甲种零件,其余的加工乙种零件.•已知每加工 一个甲种零件可获利16元, 每加工一个乙种零件可获利24元. 若此车间一 共获利1440元,•求这一天有几个工人加工甲种零件. 7.某地区居民生活用电基本价格为每千瓦时...
长春移动动感地带的卡有几种收费方式。有9元包75分钟的吗、具体收费_百...
送一个亲情号码,与亲情号码间通话0.15元\/分。除基本费用外可选择累积计划:短信计划:10元\/月150条短信;20元\/月350条短信;40元\/月800条短信 彩信计划:5元\/月10条彩信;10元\/月25条彩信;20元\/月60条彩信 熄灯计划:3元,晚9:00--早7:00网内短信0.05元\/条 周末\/节假日计划:10元...
求七年级上一元一次方程的应用题
回答者:于安乾 - 一派掌门 十三级 7-29 15:00 某车间每天能生产甲种零件120个,或乙种零件100个,或丙种零件200个,甲,乙,丙三种零件分别取3个,2个,1个可配成一套。现要求在30天内生产出最多的成套产品,甲,乙,丙三种零件应该各安排生产多少天? 一、小数一步加、减法应用题 1、一本数学读物6.25元,...
有些5元`1元和5角的人民币,要从中拿出10元,用加法,有几种拿法?
五元面值最大,我们以五元的张数来分类 第一组,五元拿两张 第二组,五元拿一张,此时剩下五元需要一元和五角来凑 ①五张一元②四张一元两张五角。。。一直到⑥十张五角 第三组,不拿五元,全是一元和五角 ①十张一元②九张一元两张五角。。。一直到二十张五角,一共11种拿法 于是由加法...
座机费有几种收费方式?
以联通固定电话资费为例:1、单固话资费:25元\/月\/部,含100分钟国内通话时长,超出后主叫国内0.15元\/分钟(不含台港澳地区),接听免费。2、融合套餐内加装固话资费:0元\/月\/部,套餐内含300分钟语音通话时长,超出后主叫0.15元\/分钟(不含台港澳地区),接听免费。温馨提示:上述回答以重庆为例...
谁有一元一次方程应用题及答案?50题,急.谢谢?
1、水产养殖的成本包括水面年租金,苗种费用和饲养费用,求每亩水面虾蟹混合养殖的年利润(利润=收益—成本); 2、李大爷现有资金25000元,他准备再向银行贷款不超过25000元,用于蟹虾混合养殖,已知银行贷款的年利率为10%,试问李大爷应租多少亩水面,并向银行贷款多少元,可使年利润达到36600元? 1、水面年租金=500元...
小学一年级的数学试题
1元钱可以买到哪些学习用品?(5) 八、看图回答问题,并列式解答。(15) 1.每件物品各买一个,最少要带多少钱? 2.用10元钱买了两样物品,可能买的是什么?3.用20元钱买哪三样物品剩钱最少?剩多少钱? 一年级数学测试题题号 一二三四五六七八九十 总分一、 填空1、哪个框的“★”多,在最多的画“√”,...
四年级下册应用题及答案
(2)微波炉当天营业额比电饭煲多多少元? 【答案解析】1、分析和解答:首先算出一天用多少千克的水,一周七天,一周流掉84千克,也就是一天用:84÷7=12千克然后一个月按30天计算,也就是一个月流掉水的重量:30×12=360千克答:一个月要流掉360千克水。 2、分析和解答:先算出四年级3个班总种植多少棵树:3×23...
1,000,00是一万块吗 还是一千块钱
1,000,00是十万,不是一万,也不是一千。中国的"," 表示:千分号;"."表示小数点。3个"0"则表示千分号;而且可以在根据数值的需要重复出现。如:1,000,000.00 这个就是一百万。1.00 这个就是一。钱,一种等值量化的交换工具,促进社会繁荣发展的一种金融流通工具。钱代表货币,一般等价物,...
初侧丹珍:[答案] 这个就很多了.好难得数喔
轮台县18055617746: 一张100元人民币换成1元,2元,5元,10元的纸币,每种纸币至少一张,问同学们共有几种方法 - ?
初侧丹珍: 有16种,(下面以括号里的数字代替个数) 一.当5元有2个时,10元可以有(7个.5个.3个.1个),20元可以有(1个.2个.3个.4个).10元和20元是对应的,即;当10元是7个时,20元是1个.下面一样. 二.当5元有4个时,10元可以有(6个.4个.2个...
轮台县18055617746: 某商店要把面值100元的一张人民币换成零钱,现有足够面值为50元,20元,10元的人民币,则共有几种换法? - ?
初侧丹珍:[答案] 共有10种换法
轮台县18055617746: 把一张面值100元的纸币换成50元,20元或10元的纸币,一共有多少种换发 - ?
初侧丹珍:[答案] 10种: 50+50 50+20+20+10 50+20+3*10 50+5*10 5*20 4*20+2*10 3*20+4*10 2*20+6*10 20+8*10 10*10
轮台县18055617746: 把一张面值100元的纸币换成50元、20元或10元的纸币,一共有多少种换法? - ?
初侧丹珍: 1)50元 X 2张 =100元 2)20元 X 5张=100元 3)10元 X 10张=100元 4)20元 X 4张 +10元 X 2张 =100元 5)50元 +10元+20元 X 2张 =100元 6)50元+20元+10元 X 3张=100元 就想了这么多咯.
轮台县18055617746: 将100元面额的钞票兑换成1元、2元、5元面额的钞票,给出所有可能的兑换方案. - ?
初侧丹珍: 如只兑换一张5元,一张1元可兑换47张2元;如只兑换一张5元,三张1元可兑换46张2元;如只兑换一张5元,五张1元可兑换45张2元;以此类推:1元面额张数为奇数递增,2元面额张数为相连数递减,如只兑换一张5元,最多可兑换93张1元面额,1张2元面额. 如只兑换一张1元面额,最多可兑换19张5元,2张2元或47张2元、1张5元. 如只兑换一张2元面额,最多可兑换19张5元,3张1元或93张1元、1张5元.
轮台县18055617746: 用1张面值100元的纸币,换成面值分别为1元、2元、5元、10元、20元、50元的纸币.面值/元125102050张数(1)请将表格填写完整.(2)观察表格,面值和... - ?
初侧丹珍:[答案] (1)100÷1=100(张), 100÷2=50(张), 100÷5=20(张), 100÷10=10(张), 100÷20=5(张), 100÷50=2(张), ... 20*5=100, 50*2=100, 因为相对应的两个数的乘积是一定的,所以面值和张数成反比例. 故答案为: 100 50 20 10 5 2.
轮台县18055617746: 将100元兑换成1元,5元,10元有多少种换法,怎么换??? - ?
初侧丹珍: 设1元的张数为x,5元的为y,10元的为z 1*x+5*y+10*z=100 ∵0<z<10 ∴当z=9时,y=1,x=5(一种); z=8,y=3,x=5;z=8,y=2,x=10;z=8,y=1,x=15(三种); 注意观察发现y的个数等于种数;z=7,y=5......(五种),z=6,y=7.....七种;z=5,y=9......九种,......;z=1,y=17......十七种; 综合得(1+17)*9\2=81(种)
轮台县18055617746: 把100元钱换成整十面值的钱币,共有10种换法, - ?
初侧丹珍: 50+50 50+20+20+10 50+20+10+10+10 50+5*10 5*20 4*20+10+10 3*20+4*10 2*20+6*10 20+8*10 10*10
轮台县18055617746: 急急急!!!问题:把100元人民币,要求兑成50元,20元,10元,5元的若干张 算一算.有多少种兑换方法 写下来 - ?
初侧丹珍: 你的这问题让人有些疑惑,这100元要一下子兑换的零币必须有50、20、10、5元四种吗?若是这样光50、20元就占70元了,只剩30元,就剩两种兑换方法:10元两张、5元两张;10元一张、5元四张.若是随便只要有两种币种就行,那没有一点规律,好像不应这样.