问题描述:给定一组数额不等的硬币(数量不限),给定要找的数额,找出硬币数最少的解决方案(不考虑极端情况,最小硬币大于需要找零的数额);
分析:这是一个最简单的动态规划问题,采用贪心算法,每次尝试用最大数额的硬币,如果不行,回退到上一步,具体到代码是采用递归的方式来解决。
难点:
1.什么情况下无法找零
2.什么情况下需要回退,如何回退
3.什么情况需要继续采用贪心策略
在解决上面几个难点之前,需要对我们的贪心策略的规律有一些了解:
1.后排的硬币,不应该大于前排;
我们定义一个变量total,用来表示未找零的数额;定义min表示最小硬币的数额;
那么对于难点1,应该是第一个硬币是最小值,并且剩余未找零数额不为0且小于最小值时;
对于难点2,当total小于min并且队伍里面存在大于min的硬币,那么我们可以将硬币替换成其它硬币来尝试新的检索;
对于难点2,回退策略应该是:从队列末尾找出一个比min大的硬币,用比这枚硬币稍小的硬币替换,并将后续的节点全部清除;
对于难点3:只要total大于min,我们就可以选择硬币中尽量大的并且不大于队列末尾值的硬币来填充。
下面是java代码:
package dp;
import java.util.LinkedList;
import java.util.List;
/**
* 硬币找零
*/
public class GetChange {
private static int[] coins = {1, 3, 4, 5};
public static void main(String args[]) {
List<Integer> list = new LinkedList<>();
circle(list, 2);
System.out.println(list);
}
private static void circle(List<Integer> list, int total) {
//找零完成
if (total == 0)
return;
//找零失败
if (list.get(0) == coins[0] && total < coins[0])
return;
//回退操作
if (total < coins[0]) {
for (int i = list.size() - 1; i >= 0; i--) {
//从队伍末尾开始,找到第一个可以变小硬币
boolean flag = false;
for (int j = coins.length - 1; j >= 1; j--) {
if (coins[j] == list.get(i)) {
//找到了
flag = true;
//清除后面的硬币
for (int k = list.size() - 1; k >= i; k--) {
total = total + list.get(k);
list.remove(k);
}
list.add(coins[j - 1]);
total = total - coins[j - 1];
break;
}
}
if (flag) {
//退出外层循环
break;
}
}
circle(list, total);
return;
} else {
//贪心策略
for (int i = coins.length - 1; i >= 0; i--) {
//加入条件,硬币尽可能大,并且不大于队伍尾数
if (list.size() > 0) {
if (coins[i] <= total && coins[i] <= list.get(list.size() - 1)) {
list.add(coins[i]);
total = total - coins[i];
break;
}
} else {
if (coins[i] <= total) {
list.add(coins[i]);
total = total - coins[i];
break;
}
}
}
circle(list, total);
return;
}
}
}
分享到:
相关推荐
《MK2硬币找零器开发资料》是一份详尽的文档集合,专注于MK2硬币找零器的开发与测试。这份资料旨在为工程师和开发者提供必要的技术指导,帮助他们理解和实现硬币找零器的功能,提升其性能和稳定性。下面我们将深入...
一个简单的动态规划算法实例,实现硬币找零的最小硬币数以及每种面额硬币的数量。
### 最少硬币找零算法 #### 算法背景及意义 在日常生活中,硬币找零是一个常见的场景。如何用最少数量的硬币完成找零,既节省了资源又提高了效率,是一个值得研究的问题。本算法通过动态规划的方式解决最少硬币...
算法设计 硬币找零 程序 算法设计 硬币找零 程序 算法设计 硬币找零 程序 算法设计 硬币找零 程序
中文版,富士硬币找零器MDB通信协议,协议非常详细,1.适用范围 本规格适用于采用MDB通信的硬币兑换器,对主控部分与硬币兑换器之间的串联信号传送方式作出规定。 2.基本通信规格 2.1 概要 依照MDB/...
在IT行业中,硬币机和硬币找零机的对接开发是自助服务系统的一个重要环节,常见于自动售货机、公交充值机等场景。这些设备的高效运作依赖于精确的编程流程和通信协议,确保硬币的准确投入、识别、找零以及与后台系统...
Java 动态规划算法——硬币找零问题实例分析 Java 动态规划算法是解决复杂问题的一种有效方法,通过将大问题分解成小问题,从而逐步解决问题。在本文中,我们将通过实例分析 Java 动态规划算法——硬币找零问题,...
Java动态规划之硬币找零问题实现代码 Java动态规划是一种非常重要的算法思想,通过将问题分解成多个子问题,先求解子问题,然后将这些子问题的解保存起来,以便在求解较大子问题时可以直接使用这些已经计算过的解,...
【bccs:Bcube硬币找零解决方案】是一个基于Java技术实现的找零系统,它旨在高效、准确地解决日常生活中硬币找零的问题。在零售、自动售货机等场景中,硬币找零的计算是个重要的环节,需要快速且无误地计算出顾客应...
硬币找零问题是一个经典的计算机科学问题,它涉及到算法设计和优化,特别是在动态规划领域的应用。在这个问题中,我们被给定一组不同面额的硬币以及一个目标金额,任务是找出最少数量的硬币来组成这个目标金额。在...
首先,我们要明确问题的定义:假设我们有一组不同面值的硬币,如1元、5元、10元等,目标是找出找零给定金额所需的最少硬币数量。例如,如果总金额是19元,而我们有1元、5元和10元的硬币,我们可能会选择用1个10元、1...
为了简化问题,我们假设所有的货币面额都是正实数,并且没有硬币短缺的情况。我们需要设计一个算法来计算最少数量的货币单位来完成找零过程。 #### 三、贪心算法原理 贪心算法的核心思想是局部最优选择。对于找...
### 贪心算法在最少硬币找零问题中的应用 #### 一、问题背景及定义 在实际生活中,我们经常遇到需要找零的情况。如何用最少数量的硬币完成找零?这个问题不仅关乎日常生活中的便利性,也是计算机科学领域内一个...
在这个“算法设计与分析之动态规划求解硬币问题”的案例中,我们将探讨如何使用动态规划方法来解决一个经典的组合优化问题:硬币找零问题。 硬币找零问题的基本设定是这样的:你有一组不同面值的硬币,目标是找出...
在寻找最少硬币找零方案时,贪心策略是每次都使用最大面值的硬币来尽可能减少硬币数量。遍历硬币面值,从最大面值开始,如果剩余金额可以被该面值整除,则减去这个面值并减少需要的硬币数。这样不断迭代直到支付金额...
在“易语言找零巧数算法”这个主题中,我们主要讨论的是如何利用易语言来实现一种高效的找零算法,尤其是在零售、餐饮等场景下,计算给定金额找零时最小硬币组合的问题。 找零巧数算法的核心在于优化硬币的组合,以...
尽管贪心算法可能不总能得到绝对最优解,但在硬币找零问题中,它能提供一个有效的近似解。这种方法已被证明在硬币面值组合为特定集的情况下是最优的,如美国货币系统。贪心算法的实现在不同编程语言中逻辑一致,但...
找零巧数算法通常涉及到最少硬币找零的问题,即给定一个总金额和一系列不同面值的硬币,如何用最少数量的硬币来组成这个总金额。这个问题可以通过动态规划或者贪心算法来解决。在易语言中,我们可以使用循环和条件...