ACM程序设计大赛-------- 最少钱币数(Java代码)
2015-06-29 09:17
651 查看
【问题描述】
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑 15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。
你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
【要求】
【数据输入】
输入可以有多个测试用例。每个测试用例的第一行是待凑的钱数值M(1 <= M <= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K个互不相同的钱币面值Ki(1 <= Ki <= 1000)。输入M=0时结束。
【数据输出】
每个测试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。
【样例输入】
15
6 2 5 10 20 50 100
1
1 2
0
【样例输出】 2
Impossible
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑 15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。
你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
【要求】
【数据输入】
输入可以有多个测试用例。每个测试用例的第一行是待凑的钱数值M(1 <= M <= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K个互不相同的钱币面值Ki(1 <= Ki <= 1000)。输入M=0时结束。
【数据输出】
每个测试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。
【样例输入】
15
6 2 5 10 20 50 100
1
1 2
0
【样例输出】 2
Impossible
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class ACM { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); List<Integer> result=new ArrayList<Integer>(); int typeNum=0; int money=0; boolean isOK=true; System.out.println("请输入一个待凑钱币,输入0结束"); while(isOK){ try { money=scan.nextInt(); isOK=false; } catch (Exception e) { // TODO: handle exception System.out.println("输入有误,请重新输入一个正整数"); isOK=true; } } while(money!=0){ int count=0; System.out.println("请输入货比种类数"); isOK=true; while(isOK){ try { typeNum=scan.nextInt(); isOK=false; } catch (Exception e) { // TODO: handle exception System.out.println("输入有误,请重新输入一个正整数"); isOK=true; } } int[] type=new int[typeNum]; System.out.println("请输入货币面值"); for (int i = 0; i < type.length; i++) { type[i]=scan.nextInt(); } type=reverse(type); for (int i = 0; i < type.length; i++) { while(money/type[i]!=0){ money-=type[i]; count++; } } result.add(count); System.out.println("请输入一个待凑钱币,输入0结束"); isOK=true; while(isOK){ try { money=scan.nextInt(); isOK=false; } catch (Exception e) { // TODO: handle exception System.out.println("输入有误,请重新输入一个正整数"); isOK=true; } } } for (int i = 0; i < result.size(); i++) { if(result.get(i).intValue()==0){ System.out.println("Impossible "); }else{ System.out.println(result.get(i).intValue()); } } } public static int[] reverse(int[] arr) { int temp=0; for (int i = 0; i < arr.length; i++) { for (int j = i; j < arr.length; j++) { if(arr[i]<arr[j]) { temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } return arr; } }
相关文章推荐
- Java清理临时目录文件Demo(一)
- 【Spring学习笔记-MVC-12】Spring MVC视图解析器之ResourceBundleViewResolver
- 《Java课程实习》日志(周一)
- 实习日志1---MyEclipse与MySql的链接,数据库的创建
- 详细记录一下JAVA应用程序服务出现内存溢出的利用MAT分析过程
- 介绍几个java把网页报存为图片的框架
- struts2中非表单标签的使用 componen
- java集合类之------Properties
- 开源 java CMS - FreeCMS2.3会员头像设置
- java中的Timer和TimerTask
- Java String is "immutable"
- 《编程导论(Java)·11.1(排序)说明》
- 关于 Java 性能监控您不知道的 5 件事,第 1 部分
- 在 Java SE 6 中监视和诊断性能问题
- Java SE 6 新特性: JMX 与系统管理
- Java基础学习笔记。
- Java SE 6 新特性: Instrumentation 新功能
- Java SE 6 新特性: Java DB 和 JDBC 4.0
- Java SE 6 新特性: 对脚本语言的支持
- Java SE 6 新特性: XML API 与 Web 服务