找零钱的方案数以及所需最少张数的钞票的方案

2023-05-16

问题描述:

我们知道人民币有1元,2元,5元,10元,20元,50元,100元这几种表示,现在给你一个整数 n  让你找零,求出有多少种方案。

例如  n=4,则方案可为1+1+1+1,2+2,  1+1+2,总共3种。


方案一 :笨方法

 100a+50b+20c+10d+5e+2f+g=n,a,b,c,d,e,f,g分别为各种面值钞票的张数。通过穷举和限制条件可以求出方案数

方案二:动态规划

 方案一针对的是有限个面值,局限性太大。下面就推出动态规划的方法

我们 规定 f(n,i) 为找零n的所有方案数,其中 i 是找零数组   RMB[]={1,2,5,10,20,50,100} 的最大可找零钱的下标。

举个具体的例子,比如说你有6块钱,那么你最大可找零的钞票是5,那么此时的 i 就是2.

找零的原来很简单,要么包括 最大可找零钞票,要么不包括。

由此可演化出 递归公式   f(  n,  i )= f(n-RMB[i], i)+f(n, i-1);        // 第一项为包括 RMB[i] 的方案数,第二项为不包括的方案数

具体的实现代码:

import java.util.Scanner;

public class zhaolingqian {

	private static int count=0;
	static int RMB[]={1,2,5,10,20,50,100};

	public static void main(String[] args) {
		// TODO Auto-generated method stub
         // 100a+50b+20c+10d+5e+2f+g=n
		Scanner in=new Scanner(System.in);
		while (in.hasNextInt()) {
			int n=in.nextInt();
			if (n==0) {
				break;
			}
			
			//  笨方法。
			/*count=0;
			for (int a = 0; a <=n/100; a++) {
				for (int b = 0; b <=n/50; b++) {
					for (int c = 0; c <=n/20; c++) {
						for (int d = 0; d <=n/10; d++) {
							for (int e = 0; e <=n/5; e++) {
								for (int f = 0; f <=n/2; f++) {
									for (int g = 0; g <=n; g++) {
										if(100*a+50*b+20*c+10*d+5*e+2*f+g==n) {
											count++;
											continue;
										}
											
											
									}
								}
							}
						}
					}
				}
			}
			System.out.println(count);*/
			
			
			
			
			
			//  动态规划方法
			int i=0;
			for ( i = 6; i >=0&&RMB[i]>n; i--) ;  // 找到最大的可找零钱的下标
			System.out.println(find(n,2));
			
			
		}
		
		
		
		
	}
	
	// 找到可找零钱的方案数
	private static int find(int n, int i) {
		// TODO Auto-generated method stub
		if (n<0) {
			return 0;
		}
		if (n<=1||RMB[i]==1) {
			return 1;
		}
		
		
		return find(n-RMB[i], i)+find(n, i-1);        // 第一项为包括 RMB[i] 的方案数,第二项为不包括的方案数
	}

}

测试结果:


进阶: 怎么找到 最少张数的钞票的方案 ?

我们采用自下而上的动态规划方法

import java.util.Scanner;

public class dtghZhaoLing {
	static int RMB[]={1,2,5,10,20,50,100};
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		  Scanner in=new Scanner(System.in);
		  while (in.hasNext()) {
			  int n=in.nextInt();
	          int res[][]=f (n);
	          while(n>0){
	        	  System.out.println(res[1][n]);
	        	  n=n-res[1][n];
	          }
		}
		 
          
	}
	private static int[][] f(int n) {
		// TODO Auto-generated method stub
		int s[][]=new int[2][n+1];
		s[0][0]=0;
		
		for (int i = 1; i <=n; i++) {
			int q=n;
			int k=0;
			for ( k = 6; k >=0&&RMB[k]>n; k--) ;   // 找到最大的可找零钱的下标
			for (int j = 0; j <=k; j++) {
				if (i>=RMB[j]&&q>=1+s[0][i-RMB[j]]) {
					q=1+s[0][i-RMB[j]];
					s[1][i]=RMB[j];
				}
			}
			
			s[0][i]=q;
		}
		return s;
	}

}

测试结果:



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找零钱的方案数以及所需最少张数的钞票的方案 的相关文章

随机推荐

  • java怎么去除字符串中的数字。。。

    比如 xff1a str 61 123assume345contribute 把数字去掉 str 61 assumecontribute public class Hello public static void main String a
  • FFplay源码分析-EOF

    本系列 以 ffmpeg4 2 源码为准 xff0c 下载地址 xff1a 链接 xff1a 百度网盘 提取码 xff1a g3k8 FFplay 源码分析系列以一条简单的命令开始 xff0c ffplay i a mp4 a mp4下载链
  • ubuntu离线安装软件及依赖

    因为工作站不能联网 xff0c 所以需要离线下载相应的安装包来安装 Linux中的安装包有个问题 xff1a 一个包可能有很多个依赖 在联网条件下 xff0c 会直接下载相应的依赖 xff0c 但是在离线条件下 xff0c 如何确保依赖下载
  • Ubuntu16.04 获取并启用root账户的方法

    1 打开终端 xff0c 输入 xff1a sudo passwd root xff0c 然后更改root密码 2 输入 xff1a su root xff0c 是否可以进入root用户 xff0c 如果出现前面root 64 用户名 xf
  • AngularJs与ReactJS优缺点&适用场景

    Angular的优缺点 xff1a 优点 AngularJS是一套完整的框架 xff0c angular有自带的数据绑定 render渲染 angularUI库 过滤器 directive 模板 服务 q defer http xff0c
  • Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'inform

    Expression 1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 39 information schema PROFIL
  • rabbitmq的消息持久化处理开启,再关闭后,消费者启动报错

    今天在测试rabbitmq的消息持久化处理时 xff0c 一切顺利 xff0c 可是再想测试ACK消息确认机制时 xff0c 消费者却无法启动了 xff0c 报如下错误 xff1a org springframework amqp rabb
  • VMware下Linux无法播放声音的解决方案

    问题背景 宿主机环境 xff1a Windows 10 VMware Workstation版本 xff1a VMware Workstation 12 VMware Workstation 15 客户机环境 xff1a CentOS 7
  • pip更新及Requirement already up-to-date解决方法

    pip更新及Requirement already up to date解决方法 文 xff1a 铁乐与猫 2018 9 11 更新命令 将pip更新到最新版本 python m pip install upgrade pip Anacon
  • 如何高效的使用适配器Adapter

    如何高效的使用适配器Adapter 当我们在使用ListView GridView时 xff0c 都会给其设置相应的适配器 xff0c 用来给其设置数据 xff0c 会去继承BaseAdapter xff0c 重写getCount getI
  • kotlin 没有@Parcelable注解

    在使用kotlin的时候 xff0c 有的时候需要对实体类进行序列化的操作 序列化的方式就两种 xff0c 一种是Serializable xff0c 一种是Parcelable 在android中 xff0c 基本都是使用的Parcela
  • Android studio3.0+ 编译Lame库(CMake方式)

    最近在学习音视频方面的知识 xff0c 购买了音视频开发进阶指南 xff0c 在交叉编译LAME库的时候 xff0c 书中使用的还是旧版本的编译方式 xff0c 现在android studio在2 2以后就开始使用CMake的编译方式了
  • 打印正整数n拆分的所有情况

    题目 xff1a 把一个正整数n拆分成若干个正整数的相加 xff0c 列出所有组合 例如 xff1a 4 61 4 4 61 1 43 3 61 2 43 2 4 61 1 43 1 43 2 4 61 1 43 1 43 1 43 1 动
  • redis实现积分排行榜

    在项目开发中常常遇到一些积分排行的问题 一个典型的积分行榜包括以下常见功能 xff1a 能够记录每个用户的分数 xff1b 能够对用户的分数进行更新 xff1b 能够查询每个用户的分数和名次 xff1b 能够按名次查询排名前N名的用户 xf
  • 如何减小Ubuntu 16.04系统下VMware虚拟机硬盘空间占用过大问题

    VMware虚拟机占用硬盘空间只增大不减少 xff0c 即使你删除文件 xff0c 占用的硬盘空间也不释放 用了一段时间后空间不够了 解决办法 方法一 在vmware的安装目录下 xff0c 有一个vmware vdiskmanager 关
  • 使用Redis实现积分排行榜,并支持同积分按时间排序

    排行榜这个功能很常见 xff0c 多用于激励用户活跃和拉新 xff0c 比如CSDN平台实现的周榜 xff0c 按照每周文章总阅读量进行排名 xff0c 用排名和奖品激励用户持续在平台上输出高质量内容 最近笔者也做了一个积分排行榜的功能 x
  • 神奇的排序

    代码 xff1a 此方法只能对互不相同的正整数排序 xff0c 也成为神奇的排序 xff0c 从编程珠玑中看到的 public class magicSort public static void main String args TODO
  • 学会自己测天气之 起卦篇

    找三个一元的硬币 xff0c 找一个安静的没人的地方 xff0c 把钱合在掌内反复摇动 xff0c 心中反复问神灵你想问的事情 然后抛出硬币 xff0c 记录反面 xff08 有花的那面 xff09 的数量 xff08 总共有四种情况 xf
  • Java 使用 jdbc 连接 mysql

    首先要下载Connector J地址 xff1a http www mysql com downloads connector j 这是MySQL官方提供的连接方式 xff1a 解压后得到jar库文件 xff0c 需要在工程中导入该库文件
  • 找零钱的方案数以及所需最少张数的钞票的方案

    问题描述 xff1a 我们知道人民币有1元 xff0c 2元 xff0c 5元 xff0c 10元 xff0c 20元 xff0c 50元 xff0c 100元这几种表示 xff0c 现在给你一个整数 n 让你找零 xff0c 求出有多少种