博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
笔试题目:RMB组合,有如下RMB 面额, 1,2,5,10,20,50,100,给定各面额纸币数和RMB总额,求组合方案——递归回溯算法
阅读量:3943 次
发布时间:2019-05-24

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

RMB组合,有如下RMB 面额, 1,2,5,10,20,50,100,给定一个RMB总额,求组合方案。各纸币面额数没有限制。

动态规划实现参考:
如果需要纪录各方案使用的面额,则得使用递归回溯,纪录到List,代码如下:

import java.util.ArrayList;import java.util.List;import java.util.Scanner;/** * Title: * Description:递归 * 

* RMB面额:1 2 5 10 20 50 100 * 给定一个总额,求组合方案,面额纸币数量不限制且无限 * * @author WZQ * @version 1.0.0 * @date 2021/3/26 */public class Money01 {

// 面额 static int[] money = {
1, 2, 5, 10, 20, 50, 100}; static List
> result = new ArrayList<>(); public static void main(String[] args) {
Scanner input = new Scanner(System.in); int n = input.nextInt(); dfs(new ArrayList<>(), 0, n, 0); // 打印结果 for (List
list : result) {
System.out.println(list); } } /** * 递归回溯 * * @param lists 存放已选 * @param sum 总额 * @param current 当前额 */ public static void dfs(List
lists, int k, int sum, int current) {
if (sum == current) {
// 符合的结果,需要重新new result.add(new ArrayList<>(lists)); } if (sum <= current || k >= 7 || sum < current + money[k]) {
return; } // 各种面值递归 for (int i = k; i < money.length; i++) {
lists.add(money[i]); dfs(lists, i, sum, current + money[i]); // 回溯,删除最后一个 lists.remove(lists.size() - 1); } } /** * 动态规划 * @param n 总额 */ public static void dy(int n) {
// 纸币面额 int[] money = {
1, 2, 5, 10, 20, 50, 100}; // 当前总额的组合数 int[] dp = new int[n + 1]; dp[0] = 1; for (int i = 0; i < 7; ++i) {
// 公式 for (int j = money[i]; j <= n; ++j) {
dp[j] = (dp[j] + dp[j - money[i]]); } } System.out.println(dp[n]); }}

问题进阶:RMB组合, 有如下RMB 面额, 1,2,5,10,20,50,100,给定各纸币面额数量和RMB总额,求组合方案,打印各方案的选择,这里不是计数,而且各面额纸质数量有限制,题目输入。

递归回溯算法:

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Scanner;/** * Title: * Description:递归回溯 * 

* RMB面额:1 2 5 10 20 50 100 * 给定各面额纸质数和一个总额,求组合方案 * * @author WZQ * @version 1.0.0 * @date 2021/3/26 */public class Money02 {

// 面额 static int[] money = {
1, 2, 5, 10, 20, 50, 100}; // 统计面额纸币数 static Map
maps = new HashMap<>(); static List
> result = new ArrayList<>(); public static void main(String[] args) {
Scanner input = new Scanner(System.in); int n = input.nextInt(); // 输入每种面额纸币数 for (int i = 0; i < 7; i++) {
int m = input.nextInt(); maps.put(money[i], maps.getOrDefault(money[i], 0) + m); } dfs(new ArrayList<>(), 0, n, 0); // 打印结果 for (List
list : result) {
System.out.println(list); } } /** * 递归回溯 * * @param lists 存放已选 * @param k 当前位置,后面比前大,保证顺序和唯一 * @param sum 总额 * @param current 当前额 */ public static void dfs(List
lists, int k, int sum, int current) { if (sum == current) { // 符合的结果,需要重新new result.add(new ArrayList<>(lists)); } if (sum <= current || k >= 7 || sum < current + money[k]) { return; } // 各种面值递归,只能大于等于k for (int i = k; i < 7; i++) { if (maps.get(money[i]) >= 1){ // 使用该面额纸币 lists.add(money[i]); maps.put(money[i], maps.get(money[i]) - 1); dfs(lists, i , sum, current + money[i]); // 回溯 lists.remove(lists.size() - 1); maps.put(money[i], maps.get(money[i]) + 1); } } }}

转载地址:http://vviwi.baihongyu.com/

你可能感兴趣的文章
关于win10的升级
查看>>
cacti突然不显示流量
查看>>
发现一个好工具记录一下,U盘启动ISO文件。
查看>>
centos7下配置网卡以及查询网卡UUID
查看>>
适用于旧计算机的10款最佳轻量级Linux发行版
查看>>
在VMware Workstation中批量创建上千台虚拟机
查看>>
linux常用软件收集
查看>>
linux查看桌面环境
查看>>
centos8安装ntfs-3g后,不能自动挂载U盘(NTFS格式)
查看>>
Linux安装显卡驱动
查看>>
使用minicom
查看>>
linux常用外设-打印机指纹和蓝牙的安装管理
查看>>
记录一下安装在移动硬盘上的fedora linux v33在各种笔记本下的兼容性
查看>>
关于安装系统后不能启动的问题!
查看>>
U盘的挂载过程-先记录一下
查看>>
python程序启动过程报错的排错一般步骤
查看>>
linux下UEFI的管理
查看>>
类thinkpad笔记本安装deepinv20后启动黒屏的解决
查看>>
利用本地centos镜像升级centOS
查看>>
FreeBSD常用操作
查看>>