主要思路是,用一个数组coinsUsed[]来保存找i分钱所需的硬币数,(i==maxchange就是我们正在寻找的解),用一个数组lastCoin[]来保存哪一个硬币是最后用来得到最佳找零方案的信息。coins[] 用来记录硬币零钱有哪几种,differentCoins记录下coins[]的长度。maxChange记录最后的要兑换的零钱数。该算法复杂度为O(NK),N为不同面值的硬币数目,K是我们要找的的零钱数量。
- public final class MakeChange
- {
-
-
-
-
- public static void makeChange( int [ ] coins, int differentCoins,
- int maxChange, int [ ] coinsUsed, int [ ] lastCoin )
- {
- coinsUsed[ 0 ] = 0; lastCoin[ 0 ] = 1;
-
- for( int cents = 1; cents <= maxChange; cents++ )
- {
- int minCoins = cents;
- int newCoin = 1;
-
- for( int j = 0; j < differentCoins; j++ )
- {
- if( coins[ j ] > cents )
- continue;
- if( coinsUsed[ cents - coins[ j ] ] + 1 < minCoins )
- {
- minCoins = coinsUsed[ cents - coins[ j ] ] + 1;
- newCoin = coins[ j ];
- }
- }
-
- coinsUsed[ cents ] = minCoins;
- lastCoin[ cents ] = newCoin;
- }
- }
-
-
- public static void main( String [ ] args )
- {
-
- int numCoins = 5;
- int [ ] coins = { 1, 5, 10, 21, 25 };
- int change = 0;
-
- if( args.length == 0 )
- {
- System.out.println( "Supply a monetary amount on the command line" );
- System.exit( 0 );
- }
-
- try
- { change = Integer.parseInt( args[ 0 ] ); }
- catch( NumberFormatException e )
- {
- System.out.println( e );
- System.exit( 0 );
- }
-
- int [ ] used = new int[ change + 1 ];
- int [ ] last = new int[ change + 1 ];
-
- makeChange( coins, numCoins, change, used, last );
-
- System.out.println( "Best is " + used[ change ] + " coins" );
-
- for( int i = change; i > 0; )
- {
- System.out.print( last[ i ] + " " );
- i -= last[ i ];
- }
- System.out.println( );
- }
- }
详细解释可参见教材P89
分享到:
相关推荐
一个简单的动态规划算法实例,实现硬币找零的最小硬币数以及每种面额硬币的数量。
python数据结构与算法分析,动态规划—找零问题.py
01背包问题是一个经典的动态规划问题,目标是在给定容量的背包中选择物品,使得物品的总价值最大化,但每个物品只能选择一次。这个问题同样采用动态规划的自底向上策略来解决。 1. 定义状态:`V[i][j]`表示前`i`个...
在计算机科学领域,动态规划是一种强大的算法,常用于解决复杂问题,通过将大问题分解为更小的子...通过阅读这些文件,你可以进一步理解动态规划在找零问题中的应用,以及C++和C语言在处理这类问题时的不同实现方式。
Java 动态规划算法——硬币找零问题实例分析 Java 动态规划算法是解决复杂问题的一种有效方法,通过将大问题分解成小问题,从而逐步解决问题。在本文中,我们将通过实例分析 Java 动态规划算法——硬币找零问题,...
Java动态规划之硬币找零问题实现代码 Java动态规划是一种非常重要的算法思想,通过将问题分解成多个子问题,先求解子问题,然后将这些子问题的解保存起来,以便在求解较大子问题时可以直接使用这些已经计算过的解,...
在这个“动态规划例题源代码”中,包含了解决三个经典问题的Python代码:硬币找零问题、采矿问题和爬楼梯问题。让我们逐一深入探讨这三个问题及其对应的动态规划解决方案。 1. **硬币找零问题**: 这个问题的目标...
在这个“算法设计与分析之动态规划求解硬币问题”的案例中,我们将探讨如何使用动态规划方法来解决一个经典的组合优化问题:硬币找零问题。 硬币找零问题的基本设定是这样的:你有一组不同面值的硬币,目标是找出...
动态规划(Dynamic Programming,简称DP)是一种用于解决最优化问题的算法思想,它通过将大问题分解为相互重叠的子问题,并存储子问题的解,以避免重复计算,从而达到高效求解的目的。DP的核心在于它能够识别并利用...
在这个"贪心算法找零问题"中,我们通常面对的是如何用最少数量的硬币来支付给顾客找零的问题。在超市找零的情境下,这个问题变得尤为实际。 在C++编程中,我们可以构建一个贪心算法来解决这个问题。首先,我们需要...
详细的背包问题和超市找零问题的解说, 代码详细,注释清除,方便使用
下面是一个使用C语言实现的贪心算法示例,即“钱币找零问题”,目标是用最少的钱币数量来找零。 **题目:**给定不同面额的钱币和一个总金额,使用贪心算法计算出最少需要多少个钱币来凑出这个总金额。 要求: 1、...
动态规划是一种强大的算法设计策略,常用于解决复杂问题,如找零钱问题。在这个问题中,我们通常要找出最少数量的硬币来组成一个给定的金额,假设我们有一组不同面额的硬币可用。这是一个典型的组合优化问题,动态...
[6.4.1]--411找零兑换问题的动态规划解法.srt
[6.4.1]--411找零兑换问题的动态规划解法.mp4
1. **基本概念**:动态规划问题通常定义为一个状态转移方程,其中每个状态代表问题的一个部分解,而状态间的转移则反映了问题的结构。状态转移方程描述了解决问题的步骤,即如何从已知的子问题状态推导出更大的问题...
11085 买票找零 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 一场激烈足球赛即将开始,售票员紧张地卖票着……。 每张球票50元,现在有2n(1)个球迷排队...
然而,贪心算法并不总是适用于所有情况,因为有些找零问题可能需要回溯或动态规划才能得到正确答案。在C#中,可以实现一个贪心函数,按照硬币面额降序遍历,尽可能多地使用大面额的硬币。 以上三个问题展示了C#在...
### 动态规划解决找零钱问题 #### 知识点概述 本篇文章将通过一个具体的C语言程序来探讨如何运用动态规划解决找零钱问题。找零钱问题是计算机科学和算法领域中的一个经典问题,它涉及到寻找用最少数量的硬币凑成...
本算法通过动态规划的方式解决最少硬币找零问题,不仅确保了算法的时间效率,还提供了最优解。 #### 问题描述 假设我们有 _n_ 种不同面值的硬币,每种硬币的面值分别存储在数组 _T_[1:_n_] 中。现在我们需要使用...