将100000元分解成1元、5元、10元的零钱共有多少种分解方法?

作者&投稿:邬冠 (若有异议请与网页底部的电邮联系)
~ 81种换法
一 ,每种至少一张,实际应为至少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// 因为count++;
}
} 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();
}
}


...税负是0.7怎样计算含税的销售价详细步骤 分解。急求!!!
税负率=应交税金\/销售收入 (销项税金-进项税金\/销售收入)打一个比方如果适应税率17%. 行业税负率是7%,以为税负为0.7%貌似没有。(X\/1.17*0.17-10W)\/X\/1.17=7 x为销售(含税)价格,有问题或者比清楚可以继续哦。税负率=当期应纳增值税\/当期应税销售收入 当期应纳增值税=当期销项...

接受捐赠的货物含增值税的所得税的的处理
借:营业外支出———捐赠支出97000贷:库存商品80000应交税金———应交增值税(销项税额)17000。根据《通知》的规定,甲企业将其自产的产品用于捐赠,应分解为按公允价值视同销售和捐赠两项业务进行所得税处理。1.视同销售的税务处理:由于税务上需按视同销售确认收入100000元、成本80000元,所得...

问初三化学问题
1.因为反应物是被消耗的,生成物是生成的。举个例子,你有100元,花了,你有100000元钱了吗?被花掉的钱就是反应物,你用钱买的东西就是生成物。2.因为Mg反应,空气中参加反应的O2质量不能称量,磷可以,磷的装置是密闭的,看书。3.化学反应,参加的反应物质量和生成物质量要可以使用仪器称量。

四年级下学期分解因式
25×125×8×4 =(25×4)×(125×8)=100×1000 =100000

A厂某年12个月中2月份生产产品6000件,制造费用100000元
6000x+y=100000 9000x+y=120100 x=6.7 y=59800 1.b=6.7a+59800 2.10500*6.7+59800=130150

分解因式10001乘99999
10001乘99999=(10000+1)(100000-1)朋友,请及时采纳正确答案,下次还可能帮您,您采纳正确答案,您也可以得到财富值,谢谢。

100000的5次方是多少?
10的5次方等于多少:=10×10×10×10×10=100000。1、n很小的整数时,将这个数自乘n次即可。例如:2的5次方就是2×2×2×2×2=32。2、当n为较大可将n因数分解x*y时,可分两步算a^n=a^(x*y)=(a^x)^y。例如:10^15=10^(3*5)=(10^3)^5=1000^5=10^15。10的5次方是多少 ...

DNF做了附魔师就不能再做分解师了吗?
首先。我要告诉你,这是完全可以的 如果你已经是附魔师了、你要该行。你就去沙兰那里放弃副职业。不过这要花费100000金币 然后你再去塞利亚那里接取其他副职业任务即可

甲公司的每月固定成本为100000元,其产品销售单价是100元,单位变动成本...
根据题意,可知,边际贡献率=(100-50)\/100=50% ,保本销售量=100000\/(100-50)=2000(件),保本销售额=100000\/50%=260000(元),保本作业率=2000\/5000=40%拓展资料:1,固定成本,(又称固定费用)相对于变动成本,是指成本总额在一定时期和一定业务量范围内,不受业务量增减变动...

全民飞机大战1张至尊经验卡分解多少经验
全民飞机大战1张至尊经验卡分解100000经验。根据查询相关公开信息显示,宠物经验卡分为经验卡、中级经验卡、高级经验卡、超级经验卡、特技经验卡和至尊经验卡等。虽然它们无法向宠物一样出战保驾护航,却能够给宠物喂食提供经验,帮助成长。不同经验卡提供的经验数是不同的,至尊经验卡提供100000,特级经验卡...

东至县18071417262: 将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(种)

东至县18071417262: 将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元.

东至县18071417262: 把20元换成1元、5元、10元,有几种方法
元胞爱可: 20=1*20 20=5*4 20=10*2 20=5*3+1*5 20=5*2+1*10 20=5*1+1*15 20=10*1+1*10 20=10*1+5*1+1*5 共8种

东至县18071417262: C语言,程序设计.用一百元人民币兑换成1元、5元和10元币,共有多少种不同的兑换方法.才用循环来做. -
元胞爱可: #include "stdio.h" #include "math.h" main() { printf("共有%d种不同的兑换方案",fun (int n)) } fun(int m){ int i;for(i=0;i<=10;i++){int j;for(j=0;j<=20;j++){int k;for(k=0;k<=100;k++){if(10i+5j+k==100) m+=1}}if(i==10) return m}}

东至县18071417262: 将100元面额的钞票兑换成1元、2元、5元面额的钞票,给出所有可能的兑换方案. -
元胞爱可:[答案] 元分别为:61 17 1一元,二元,五元分别为:62 4 6一元,二元,五元分别为:62 9 4一元,二元,五元分别为:62 14 2一元,二元,五元分别为:63 1 7一元,二元,五元分别为:63 6 5一元,二元,五元分别为:63 11 3一元,二元,五元分别为...

东至县18071417262: 将一张十元人民币兑换成若干张1元 2元 5元的人民币,有几种兑换方法 -
元胞爱可: 90版的百元钞大概在143元左右,80版的10元钞大概在18.5元左右!!

东至县18071417262: 将100换成1元,5元,10元的零钱有多少种换法 -
元胞爱可: 1.10张1元2.5张2元3.2张5元4.4张2元和2张1元5.3张2元和4张1元6.2张2元和6张1元7.1张2元和8张1元8.1张5元和5张1元9.1张5元和2张2元和1张1元10.1张5元和1张2元和3张1元

东至县18071417262: 将200元换成1元,5元和10元的零钱(每种都有) -
元胞爱可: 解:将200元换成1元,5元和10元的零钱 最多可以换:200÷1=200张 最少可以换:200÷10=20张100张1元的到20张10元的.

东至县18071417262: 把10元的纸币换成1元2元5元中的一种或几种,共有几种换法? -
元胞爱可:[答案] 1.10张1元 2.5张2元 3.2张5元 4.4张2元和2张1元 5.3张2元和4张1元 6.2张2元和6张1元 7.1张2元和8张1元 8.1张5元和5张1元 9.1张5元和2张2元和1张1元 10.1张5元和1张2元和3张1元

东至县18071417262: C语言,把100元换成5元,1元,0.5元的算法,输出所有换法 -
元胞爱可: 我晕哦,你说打印出来的结果从5开始计数...啊 这是因为数据太多了,前面从0开始的被冲掉了,汗!!!因为5元的还是只能从5开始计数...你自己的理解问题,你运行一次看看结果就知道了.你说说哪里不对,我都运行ok.把这两句去掉就行了:if(total>100) break;

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网