【题目描述】7621 硬币面值组合 By Oler52wa
使用1角、2角、5角硬币组成 n 角钱。 设1角、2角、5角的硬币各用了a、b、c个,列出所有可能的a, b, c组合。 输出顺序为:先按c的值从小到大,若c相同则按b的值从小到大。
输入一个整数n(1 <= n <= 100),代表需要组成的钱的角数。输出有若干行,每行的形式为:i a b c
第1列i代表当前行数(行数从001开始,固定3个字符宽度,宽度不足3的用0填充),后面3列a, b, c分别代表1角、2角、5角硬币的个数(每个数字固定12个字符宽度,宽度不足的在左边填充空格)。
说明: 0.标题样式,其中自选部分可没有。文档中几处【...】,【...】要有!!! 算法交流:空格+编目编号ID+空格+题目名称+【类别序号+类别名称】+自选部分 实例: 算法交流:7621 硬币面值组合【2.1基本算法之枚举】 1.换行用shift+enter,减少行间距,删除不需要的空行;大的主题段落间可enter回行,空间较大; 2.认真审阅全文,不要出现重字、错字、乱码和网络格式的非法标号等; 3.请不要用截图来进行题目说明,包括后面的代码; 4.文章标题banner图片可采用配发的标准图片;自选或自制的banner图片高度建议为350像素;banner图片应与主题一致; 5.英文的题目请用中文作第二次简述,可仅对题目描述部分作中文描述,需要时对原题全部英文作描述。英文和中文的题目描述格式相同; 6.二级标题或序号用英文数字+西文点(.); 7.正文标点请用中文标点; 8.请在题目描述行的尾上加上原作信息(By Oler??wa),参上; 9.应对自己的文字和文章多加推敲,像对自己的代码一样进行多次修改,不断提高; 10.应在电脑和手机上对自己文章的最终显示结果进行确认。(本格式文档就做了多次修改和更新)
【样例输入】10【样例输出】
001 10 0 0
002 8 1 0
003 6 2 0
004 4 3 0
005 2 4 0
006 0 5 0
007 5 0 1
008 3 1 1
009 1 2 1
010 0 0 2
一、题意分析
一个简单的枚举,设1角个数为a,2角个数为b,5角的硬币个数为c ,则 1*a+2*b+5*c=n;
说明: 0.正文段落标题及自行添加的小段标题要加粗。如:一、题意分析 1.请将样例的数据输入和输出阐述题目;特别是你一开始不清楚的题意,后为搞清楚了一定要加以说明; 2.努力自己构建样例数据说明一些注意点或特殊情况,验证问题解题空间的全面性和特殊数据;这点很重要,多进行这方面的训练非常锻炼能力,特别是对于一些要参加比赛的同学; 3.刨出题目中的“坑”加以说明;算法题往往有很多有意埋设的考点、有意思的东西、对数据空间考虑不同造成一些数据不能成功等等“坑”。能否认识到“坑”,很说明你的算法设计和分析能力的高低。如是否需采用“稳定”的排序算法,数据是否会溢出等。
二、算法说明
使用三重循环来枚举这三种面值,abc的循环范围是0~n/5,0~n/2,0~n/1。
....
说明: 1.算法说明突出算法的设计思想和解算过程,而不是代码说明;若设计中用到一些数学概念或必要说明的知识应列一小段加以说明; 2.首段争取用文字简要总结算法设计的方法和思想; 3.可结合题目样例的数据输入和输出阐述算法的工作机理;可用自己构建样例数据说明算法处理特殊情况的方法; 4.学会用图表、公式、伪代码等方法来简捷明晰地说明算法;该用图表的时候还是要用的; 5.算法可结合关键代码来进行说明; 6.对代码实现中的一些关键函数和亮点加以说明;对网络文章中好的观点和思想可加以应用,但在应对文章出处加以说明(用在合适的地方用括号标出出处);学习解题方法的多样性,提高算法和编程思维; 7.考虑一题多解和优缺点的对比分析为上佳,最好用图表进行对比说明。图表应在下方居中位置给出图表的标题; 8.代码和一些简单的结果不要用图片,可用文字对简单的结果进行归纳说明和对比; 9.注意阐述逻辑的严谨性,可借助分段、加序号和小段标题等突出段落结构和主题。
三、数据结构
说明: 1.应说明所用数据结构的作用和意义; 2.数据结构应与算法说明应和代码设计一致。
四、算法分析
1.起初想法使用三重循环来枚举这三种面值,abc的循环范围都是0~n。提交后结果如下:
优化后,我的想法(最终提交的代码)是:使用三重循环来枚举这三种面值,abc的循环范围是0~n/5,0~n/2,0~n/1。可以看到虽然代码长了一点点,但时间上有明显缩短,是一次成功的优化。提交后结果如下:
(注:运行时间只是算法复杂度的一个佐证,但不能作为算法复杂度的分析。可留着本段,但同时作出正规算法复杂度的预算)
2.(补充)当n确定(为10),只求组合数的时候,由1*a+2*b+5*c=10,只看两项就可以,c a对应可能的取值为
c a
0 10 8 6 4 2 0(6个)
1 5 3 1(3个)
2 0(1个)
总共个数为6+3+1=10.
因此,按照规律,本题目组合总数为10以内的偶数+5以内的奇数+0以内的偶数,又因为某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2,某个奇数m以内的奇数个数也可以表示为(m+2)/2所以,总的组合次数可以编程为:.....
也就是看表达式(这里是3*c=n-a-2*b),就是把最大乘数(这里是3)放在一边,这也是m增加的步长。而m的最大取值也就是表达式中的这个常数。当然这也是个典型的背包问题:......... 3.(补充)因为输出有格式要求,用"%03d%12d%12d%12dn"的格式输出。
说明: 1.算法分析重在正确性、时间复杂度和空间复杂度的分析; 2.用对比的方法来说明不同解法或改进前后的时间复杂度和空间复杂度;
五、代码与调试 说明: 0.代码验证通过的图片请提交给小组负责人,不需贴在文档中。 1.代码应对数据结构、关键函数的作用、核心代码和重要变量等加以说明; 2.鼓励对阶段性代码的错误和调试解决方法加以总结并共享,应附上出错信息、阶段错误代码(可局部)等。 3.代码应真实,为自己设计测试通过的代码,如发现与网上代码完全一致,将作相应的公示。