博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
硬币表示
阅读量:5257 次
发布时间:2019-06-14

本文共 1848 字,大约阅读时间需要 6 分钟。

一、题目:

  假设我们有8种不同面值的硬币{1,5,10,25},用这些硬币组合构成一个给定的数值n。 例如n=100,那么一种可能的组合方式为 100 = 2*25+5*5+2*10+5*1。 问总共有多少种可能的组合方式?

二、思路:

  先来看看递归解法,看到这种题目,不要一上来就想着我怎么来划分任务,我怎么把任务交给其他人去做。首先还是由简单到复杂,先列举一些简单的情况,发现规律。因为涉及到动态改变的问题,多种组合的方式,我们可以先在纸上写出几个简单的例子来进行分析,我们不妨写出1-25这个区间看一下n = 1-25之间的组合方案

1---12---13---14---15---26---27---28---29---210---411---412---413---414---415---6 ...

  因为给出的n直接牵涉到能够使用较大的面值 比如n = 15 它就不能够使用25的面值,只能从10 5 1这三种面值来组合。比如n = 25 我们可以使用0个25的面值而剩下的由10 5 1来进行组合, 10 可以由使用10 5 1来组合, 5可以由 5 1来组合,比如n=100,我们可以使用0个25,剩下的100交给 10 5 1去凑,也可以使用1个25,那么剩下的75也交给10 5 1去凑,也可以使用2个25,3个25,这样基本就是递归的思路了。因为涉及到两个变量在变化,我们可以在循环中使用递归来解决,其中递归的方法需要解决传入的变量的问题:涉及到钱的数量和对应面值的变化所以需要传入两个变化的量到方法中。

  再来看看递推(迭代)解法,迭代解法主要就是下一步要做的事由上一步通过某种关系来决定。比如这里种类数主要由两个变量来决定,所以需要二维数组来存储,分别是1~n,以及能够使用的哪些面值。每一个点存储的是种数。而递推解法的思路本质上是和递归一样的,只是表达的方式不一样而已。

三、代码:

1 public class 硬币表示 { 2  3     public static void main(String[] args) { 4         int ways; 5         for (int i = 1; i < 6; i++) { 6             ways = countWays(i); 7             System.out.println(i + "---" + ways); 8         } 9         System.out.println("========================================");10         for (int i = 1; i < 6; i++) {11             ways = countWay1(i);12             System.out.println(i + "---" + ways);13         }14         System.out.println("========================================");15         for (int i = 1; i < 6; i++) {16             ways = countWay2(i);17             System.out.println(i + "---" + ways);18         }19     }20     21     /**22      * 递推解法 23      */24     public static int countWay1(int n){25         int [] coins = {1,5,10,25};26         int [][] dp = new int[4][n+1];  // 前i种面值,组合出面值j27         for(int i = 0;i<4;i++){28             dp[i][0] = 1;         // 凑出面值0,只有一种可能,第一列初始化为129         }30         for(int j=0;j

四、结果:

  

 

转载于:https://www.cnblogs.com/xiaoyh/p/10341009.html

你可能感兴趣的文章
Java 中 静态方法与非静态方法的区别
查看>>
crypto加密
查看>>
Apache Jackrabbit 2.6.0 发布
查看>>
echarts饼图显示百分比
查看>>
JMS消息
查看>>
16位整数,32位整数,64位整数
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
php上传文件及头像预览
查看>>
【译】在Transformer中加入相对位置信息
查看>>
大四java实习生的一些经历
查看>>
python programming
查看>>
线程池的概念
查看>>
USB打印机开钱箱
查看>>
mysql数据库 中文乱码
查看>>
Linux下Mysql数据库互为主从的配置过程
查看>>
ECSHOP系统,数据库表名称、结构
查看>>
Python Web开发框架Django
查看>>
【Install】我是如何安装Linux类系统的
查看>>
作业三4
查看>>
多态存在的3个必要条件
查看>>