栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[经典面试题]通过不同面值的硬币,求出组合出n有多少种组合情况

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[经典面试题]通过不同面值的硬币,求出组合出n有多少种组合情况

通过不同面值的硬币,求出组合出n有多少种组合情况

本题的一个具体情况如下

给定n,求出使用给定的1,5,10,25的硬币组合出n 的组合方式有多少种

第一种:迭代法

思路分析:
例如 15

  1. 不使用10面值
    a. 不使用5面值 res = 1;
    b. 使用1个5面值 res = 1
    c. 使用2个5面值 res = 1;
    d. 使用3个5面值的 res = 1;

  2. 使用一个10面值
    a. 不使用5面值 res = 1;
    b.使用一个5面值 res = 1;

sum = 6
由上述例子可以想到,n的组合方式由两个维度决定

  1. 可使用面值的个数
  2. 使用面值之后所剩的 n - x(x为使用次数)*面值

所以本题的迭代方法需要使用到二维数组

图解如下

	public static int[][] countWays1(int n, int[] arr) {
		//规定数组大小 行:代表可用的面值  列代表 n
		int[][] res = new int[arr.length][n+1];
		//初始化 n为0时,res 1;  arr【1】 = 1时, res = 1;
		for (int i = 0; i < res[0].length; i++) {
			res[0][i] = 1;
		}
		for (int i = 0; i < res.length; i++) {
			res[i][0] = 1;
			res[i][1] = 1;
		}
		
		//填数组空缺的值
		for (int i = 1; i < res.length; i++) {
			for (int j = 2; j < res[0].length; j++) {
				//计数组合进行求和
				int sum = 0;
				//对最大的可用面值 进行计数 循环
				int times = j / arr[i]; 
				//通过对 可用最大面值的情况, 分类, 取上一层数组进行 计算 组合数
				for (int k = times; k >= 0; k--) {
					int surplus = j - arr[i]*k ;
					sum += res[i-1][surplus];
				}
				res[i][j] = sum;
			}
		}
		
		for (int i = 0; i <= n; i++) {
			System.out.print(i +" ");
			if (i == n) {
				System.out.println();
			}
		}
		for (int[] is : res) {
			
			for (int is2 : is) {
				System.out.print(is2+" ");
			}
			System.out.println();
		}
		return res;
	}
递归写法
	public static int countWay(int n) {
		if (n <= 0) {
			return 0;
		}
		
		return countWays(n, new int[]{1,5,10,25},  3);
	}
	
	
	public static int countWays(int n, int[] arr, int cur ) {
		// TODO Auto-generated method stub
		if (cur == 0) {
			return 1;
		}
		//返回的结果
		int res = 0;
		//多分枝递归,通过规定能够使用最大面值的个数进行 递归
		//例如 15  1. 不使用10面值    a. 不使用5面值  res = 1; b. 使用1个5面值  res = 1  c. 使用2个5面值  res = 1; d. 使用3个5面值的  res = 1;
		//         2. 使用一个10面值   a. 不使用5面值  res = 1; b.使用一个5面值  res = 1;
		//  		 sum  = 6;
		for (int i  = 0; i * arr[cur] <= n; i++) {
			int surplus = n - i * arr[cur];
			res += countWays(surplus, arr, cur-1);
			
		}
		
		return res;
	}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820145.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号